初学GORM框架| 青训营笔记

110 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第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()