一、概述
gorm
gorm就是基于Go语言实现的ORM库。 类似于Java生态里大家听到过的Mybatis、Hibernate、SpringData等 (grom原文档|)
orm
Object-Relationl Mapping,他与其他数据库的中间件类似,表示数据库数据与实体对象之间的映射关系,隔离了数据库的操作,使得我们在数据库的CRUD中,重点关于对象的操作,而不是底层数据的操作。方便我们在实现数据库操作的时候不用去写复杂的sql语句。
二、如何使用
连接mysql为例子
dsn := "root:pass(127.0.0.1:3306)/dbname?charset=utf8mb4\&parseTime=True\&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), \&gorm.Config{})
db.SingularTable(true)
if err != nil {
panic("failed to connect database")
}
- 在gorm.Config{}可以做一些配置,
SkipDefaultTransaction: true跳过默认开启事务模式。NamingStrategy允许用户通过覆盖默认的NamingStrategy来更改命名约定
NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_", // 表名前缀,`User`表为`t_users`
SingularTable: true, // 使用单数表名,启用该选项后,`User` 表将是`user`
}
更多配置操作可以参考github.com/go-gorm/mys…
开始CRUD
简单的增删改查
test := &Test{
ID:3,
Name:"jackie",
Age:18,
}
db.Create(test)
db.Delete(test)
db.Model(&test).Update("name", "world")
var testResult Test
db.Where("name = ?", "hello").First(&testResult)
fmt.Println("result: ", testResult)
表名和结构体映射
通过Table API声明
db.Table("test").Where("name = ?", "hello").First(&testResult)
事务操作
通过db.Transaction函数来操作事务,当闭包函数出现错误的时候,函数就会回滚,确保了读写操作的原子性
db.Transaction(func(tx *gorm.DB) error {
// 在事务中执行一些 db 操作
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
// 返回任何错误都会回滚事务
return err
}
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
return err
} // 返回 nil 提交事务
return nil
})
三、使用过程中踩到的坑
表名出错
错误Table 'DB.tests' doesn't exist,但我的表名应该是test。GORM 使用结构体名的 蛇形命名 作为表名。对于结构体 test名为 users。
解决 db.SingularTable(true)
通过db.SingularTable(true),gorm会在创建表的时候去掉”s“的后缀