开发人员友好的ORM库。
安装:go get -u github.com/jinzhu/gorm
中文文档地址:http://gorm.book.jasperxu.com/
GitHub地址:https://github.com/jinzhu/gorm
• gorm创建的表结尾默认加s
• 如果使用MySQL创建表,使用gorm进行增删查改注意字段名小写。
数据库连接
func init() {
var err error
//第⼀步:打开数据库,格式是 ⽤户名:密码@/数据库名称?编码⽅式
db, err = gorm.Open("mysql", "root:123@/mydb?charset=utf8")
if err != nil {
panic(err)
}
}
创建表
package main
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)
//Test 表
type Test struct {
ID int `gorm:"primary_key"`
Name string `gorm:"type:varchar(128);unique_index:hash_idx"`
Password string
}
var db *gorm.DB
func init() {
var err error
//第⼀步:打开数据库,格式是 ⽤户名:密码@/数据库名称?编码⽅式
db, err = gorm.Open("mysql", "root:123@/mydb?charset=utf8")
if err != nil {
panic(err)
}
}
func main() {
//创建表
if !db.HasTable(&Test{}) {
if err := db.CreateTable(&Test{}).Error; err != nil {
panic(err)
}
}
}
插入
//插入数据
Test := &Test{
ID: 1,
Name: "黄哲",
Password: "123",
}
if err := db.Create(Test).Error; err != nil {
fmt.Println(err)
return
}
删除
//删除数据,where匹配条件,然后删除,链式调用
if err := db.Where("ID = ?",1).Delete(Test{}).Error; err != nil {
fmt.Println(err)
return
}
查询
var count int
var count1 int
var test Test
var test1 []Test
//Where匹配条件,Find指定表,Count获取数量,获取单个匹配的数据时
db.Where("id = ?", 2).Find(&Test{}).Count(&count)
//Model指定表,Where匹配条件,count获取数量,多个字段可以匹配时
db.Model(&Test{}).Where("id > ?", 1).Count(&count1)
//Scan会将查找到的数据写入test中
db.Where("id = ?", 1).Find(&Test{}).Scan(&test)
db.Model(&Test{}).Where("id > ?", 1).Scan(&test1)
fmt.Println(count)
fmt.Println(count1)
fmt.Println(test)
fmt.Println(test1)
• db.First获取第一条记录
• db.Where查询条件
输出
更新数据
//更新数据
db.Model(&Test{}).Where("id = ?", 1).Updates(Test{Password: "112323"})
错误处理
所有的函数都是链式的,全部都返回 db 对象,任何时候调用 db.Error 就能获取到错误信息,例如上面的更新数据
err := db.Model(&Test{}).Where("id = ?", 1).Updates(Test{Password: "112323"}).Error
事务处理
package main
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)
//Animal 表
type Animal struct {
ID int
Name string
}
var db1 *gorm.DB
func init() {
var err error
//第⼀步:打开数据库,格式是 ⽤户名:密码@/数据库名称?编码⽅式
db1, err = gorm.Open("mysql", "root:123@/mydb?charset=utf8")
if err != nil {
panic(err)
}
}
func main() {
CreateAnimals(db1)
}
func CreateAnimals(db *gorm.DB) error {
//开启事务
tx := db.Begin()
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
//回退
tx.Rollback()
return err
}
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
//回退
tx.Rollback()
return err
}
//成功
tx.Commit()
return nil
}
demo
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)
//Test 表
type Test struct {
ID int `gorm:"primary_key"`
Name string `gorm:"type:varchar(128);unique_index:hash_idx"`
Password string
}
var db *gorm.DB
func init() {
var err error
//第⼀步:打开数据库,格式是 ⽤户名:密码@/数据库名称?编码⽅式
db, err = gorm.Open("mysql", "root:123@/mydb?charset=utf8")
if err != nil {
panic(err)
}
}
func main1() {
//创建表
if !db.HasTable(&Test{}) {
if err := db.CreateTable(&Test{}).Error; err != nil {
panic(err)
}
}
// //插入数据
// Te := &Test{
// ID: 6,
// Name: "王五",
// Password: "123",
// }
// if err := db.Create(Te).Error; err != nil {
// fmt.Println(err)
// }
// //删除数据,where匹配条件,然后删除,链式调用
// if err := db.Where("ID = ?",1).Delete(Test{}).Error; err != nil {
// fmt.Println(err)
// }
//查询数据
var count int
var count1 int
var test Test
var test1 []Test
//Where匹配条件,Find指定表,Count获取数量,获取单个匹配的数据时
db.Where("id = ?", 2).Find(&Test{}).Count(&count)
//Model指定表,Where匹配条件,count获取数量,多个字段可以匹配时
db.Model(&Test{}).Where("id > ?", 1).Count(&count1)
//Scan会将查找到的数据写入test中
db.Where("id = ?", 1).Find(&Test{}).Scan(&test)
db.Model(&Test{}).Where("id > ?", 1).Scan(&test1)
fmt.Println(count)
fmt.Println(count1)
fmt.Println(test)
fmt.Println(test1)
// //更新数据
// err := db.Model(&Test{}).Where("id = ?", 1).Updates(Test{Password: "112323"}).Error
// fmt.Println(err)
}
更多使用可以看中文文档,博文开头有