Go框架Gorm | 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天 ✌
本笔记主要是关于Gorm框架使用的一些课件外补充
ORM框架 —— Gorm
基本使用:
- (1)Gorm模型定义:模型是标准的struct,由基本的Go数据类型组成。相关部分有优先默认的约定,但支持配置。详细内容可参考:gorm.io/zh_CN/docs/… ,一个简单的示例:
type User struct {
gorm.Model
Name string
}
由于Gorm会自动添加匿名字段,因此上述定义等效于:
type User struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
Name string
}
- (2)连接数据库:Gorm需要驱动来连接数据库,目前支持的数据库:MySQL、SQLServer、PostgreSQL、SQLite和TiDB,其他数据库需要自行实现驱动连接。以下为连接SQLServer数据库示例:
import(
"gorm.io/driver/sqlserver"
"gorm.io/gorm"
)
//数据库: github.com/denisenkom/go-mssqldb
dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"
db, err := gorm.Open(sqlserver.Open(dsn),&gorm.Congif{})
注意:上面代码用的是DSN (Data Source Name) 的common format : [username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN],除了dbname,其余都是optional,所以最简格式为:/dbname
- (3)创建数据:
- 创建记录:db.Create(&data)
- 用指定的字段创建记录:更新给出的字段——db.Select("字段1","字段2",...).Create(&data) / 忽略指定字段——db.Omit("字段1","字段2"...).Create(&data)
- 批量插入:对于大量创建数据的操作,可直接将slice传递给Create方法。Gorm会自动生成对应的一条SQL创建语句,也可以使用CreateBatches方法指定创建数量,分批创建。示例如下:
- 其他创建方式(Map创建,SQL表达式,关联创建等)参考:gorm.io/zh_CN/docs/…
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)
// 假设users数量为 100
db.CreateInBatches(users, 100)
对于Upsert冲突:Gorm提供了不同的冲突处理方式以兼容不同数据库,例如:
// Do nothing on conflict
db.Clauses(clause.OnConflict{DoNothing: true}).Create(&user)
- (4)查询数据:GORM 提供了 First(根据主键检索获取第一条记录,主键升序)、Find(检索全部对象)、Where(条件检索,也可以用前两个方法内联条件检索)、Take(获取第一条记录,但是无序获取)、Last(获取最后一条记录) 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,会返回 ErrRecordNotFound 错误。
db.First(&user, 10)
// SELECT * FROM users WHERE id = 10; Primarykey find.
// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;
- (5)更新数据:Update方法的使用和Create方法比较相似。当使用 Update 更新单列时,需要有一些条件,否则将会引起错误 ErrMissingWhereClause。Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更新时,默认情况下,GORM 只会更新非零值的字段。
// 条件更新
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;
- (6)删除数据:Delete操作,一个需要注意的点是删除一条记录时,删除对象需要指定主键,如果指定的值不包括主属性,那么 GORM 会执行批量删除,它将删除所有匹配的记录。常规删除包括:根据主键删除、内联条件删除、钩子Hook删除(GORM 支持 BeforeDelete、AfterDelete Hook,在删除记录时会调用这些方法)。
db.Delete(&User{}, 10)
// DELETE FROM users WHERE id = 10;
db.Where("email LIKE ?", "%jinzhu%").Delete(&Email{})
// Batch DELETE from emails where email LIKE "%jinzhu%";