这是我参与「第五届青训营 」伴学笔记创作活动的第3天
Gorm入门
Gorm 是 Golang 的一个 orm 框架。ORM 是通过实例对象的语法,完成关系型 数据库的操作,是"对象-关系映射"(Object/Relational Mapping) 的缩写。使用 ORM 框架可以让我们更方便的操作数据库。
Gorm官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server。
作者是中国人,中文文档齐全,对开发者友好,支持主流数据库。
建立数据库连接
var db *gorm.DB
func Init() error {
var err error
dsn := "root:000000@tcp(127.0.0.1:3306)/community?charset=utf8mb4&parseTime=True&loc=Local"
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
return err
}
其中gorm.Config结构体相当于一个配置类,可以指明一些参数用于设定和配置。
标签的使用
以键值对的形式存在,如果省略键名则默认对应。
ype Post struct {
Id int64 `gorm:"column:id"`
ParentId int64 `gorm:"parent_id"`
UserId int64 `gorm:"column:user_id"`
Content string `gorm:"column:content"`
DiggCount int32 `gorm:"column:digg_count"`
CreateTime time.Time `gorm:"column:create_time"`
}
增删改查的实现
插入:
dbRes := db.create(&User{Name:"jack",Age: 18})
其中dbRes是返回的结构体,其中含有Error、RowsAffected等属性,反应了是否有错误和影响的行数。 create函数后的参数可以传入结构体的集合,达到批量创建的效果。
。
查询
查询的特别之处在于,需要提前创建结构体或集合(切片,map等)用于接收数据,并且传入时要注意传入地址对象。查询函数的返回结果也包含了错误和其他信息。
//直接检索到第几条数据
db.First(&user, 10)
// SELECT * FROM users WHERE id = 10;
db.First(&user, "10")
// SELECT * FROM users WHERE id = 10;
//多条检索查询
db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);
条件查询
方式1:使用Where字符串的形式
注意where中的参数对应。还可以用Not函数实现排除条件的功能
db.Where("name = ? AND age = 20", "小明").Not("sex = ?","female").First(&user)
也可以在where中传入一个结构体或是一个map,作为对应查询的条件。
db.Where(User{Name:"小明",Age:20}).First(&user)
db.Where(map[string]interface{}{"Name": "小明"}).find(&user)
方式2:使用内联的方式 在具体查询函数内传入sql语句字符串、结构体、集合等,同样要注意参数的对应。
//string形式
db.First(&User, "id = ?", 5)
//结构体形式
db.First(&User, TestUser{Name: "jz"})
//map形式
db.First(&User, map[string]interface{}{"Name": "jz"})
更新
几种更新的区别:
- update 只更新选择的字段
- updates 跟新所有字段,形式1 map 形式2 结构体,结构体零值不参与更新
- save everything更新 如果结构体中有0值,则只会更新非零的字段。而使用集合的形式,会更新所有字段。
//方式1
db.Where("Name = ?", "小明").Update("name", "旺财")
//方式2
user := User{name="小明"}
db.Model(&user).update("name","旺财")
//使用sql表达式
db.Model(&user).update("age",gorm.Expr("age*?+?",2,100))
删除
Unscoped真的删除这一行,没有Unscoped是软删除。 gorm.Model含有gorm.deletedat,拥有软删除的能力。拥有软删除能力的模型调用 Delete 时,记录不会被数据库删除。但 GORM 会将 DeletedAt 置为当前时间, 并且你不能再通过普通的查询方法找到该记录。
db.Unscoped().Where("name", "小明").Delete(&user)
事务
手动事务
//手动事务
tx := GlobalDb.Begin()
tx.Create(&TMG{Name: "汉子"})
tx.Create(&TMG{Name: "高大威武"})
tx.Commit()