后端实践记录之GORM | 青训营

92 阅读1分钟

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)