Gorm是一个已经迭代了十年+的功能强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源拓展。
GORM的默认约定
GORM使用名为ID的字段作为主键;
使用结构体的蛇形负数作为表名;
使用CreateAdt、UpdateAdt字段作为创建、更新时间。
type Product struct {
Code string
Price uint
}
GORM的使用
连接数据库
GORM目前支持MySQL、SQLServer、PostgresSQL、SQLite
GORM通过驱动来连接数据库,如果需要连接其他类型的数据库,可以复用/自行开发驱动
db, err = gorm.Open{
mysql.Open(dsn:"user:pass@127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"),&gorm.Config{})
if err != nil {
panic(v:"failed to connect database")
}
创建数据
使用clause.OnConflict处理数据冲突,使用default标签为字段定义默认值
db.Create(&Product{Code:"042", Price:100})
查询数据
使用First时,需要注意查询不到数据会返回ErrRecordNotFound;
使用First查询多条数据,查询不到数据不会返回错误;
当使用结构体作为条件查询时,GORM只会查询非零值地段,意味着字段值为0、“”、false或其他零值;
该字段不会被用于构建查询条件,使用Map来构建查询条件。
var product Product
db.First(&product,"code = ?", "D42")
更新数据
使用Struct更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select选择字段
db.Model(&product).Update(column:"Price", value:200)
删除数据
拥有软删除能力的Model调用Delete时,记录不会被从数据库中真正删除,但GORM会将DeletAt置为当前时间,并且不能通过正常的查询方式找到该记录;
使用Unscoped可以查询到被软删的数据。
db.Delete(&product, 1)