这是我参加「第五届青训营 」伴学笔记创作活动的第 6 天。今天主要学习的是Gorm的基本用法。
重点内容
- Gorm连接数据库的基本方法
- Grom对数据库进行增删查改的基本操作
主要知识点
一、Gorm连接数据库
在Go中,我们往往是直接利用第三方库中的数据库驱动连接数据库(go-sql-driver),而Gorm直接将这一步封装起来,编写时只需调用其声明的函数即可,具体写法如下
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
其中db为数据库指针,dsn即DataSourceName,包含了数据库连接的基本参数。其格式一般为
dsn = username:password@tcp(host:port)/dbname?charset=utf8&parseTime=True&loc=Local
二、Gorm对数据库的增删查改
gorm model
在具体介绍数据库基本操作前,首先需要了解Gorm model。Gorm model是自定义的一个结构体,在Gorm中每个model都会对应数据库中的一张表,而Gorm正是以model为媒介实现对数据库的操作,下面举个例子说明model与表的对应关系,首先我们定义一个model
type User_name struct {
UserName string `grom:"username"`
UserPwd string `grom:"password"`
}
这个model对应了表user_names,表的结构如下
List user_names(
username varchar(32),
password varchar(32)
)
以上数据库表结构可能不大严谨,但大致意思是差不多的。默认情况下Gorm会将model与其名称复数形式的表关联起来,在实际的操作中我们可以用db.table("table name")指定需要操作的表。另外,我们可以通过对grom标签的更改实现如主键(grom:"primarykey"),默认值(gorm:"default: ... ")。
创建数据
Gorm可以通过函数db.Create()创建数据并插入对应的表中,以上面的例子为例,我们希望插入数据{"temp","pass"},那么我们可以输入以下代码
user := &User_name{UserName:"temp",UserPwd:"pass"}
db.Create(user)
此时对应表中中就会插入我们想要插入的数据。
查询数据
在查询数据部分,Gorm提供了多种查询方式:
- 单值查询:db.Take(listname),db.First(listname),db.last(listname),其中First指查询主键正序排列的第一条记录,Last查询逐渐倒序排列的第一条记录
- 多值查询:db.Find(listname)
- 条件查询:db.select(字段名),类似sql语言中的select子句,返回指定字段。db.where(条件),类似sql语言中的where子句,返回满足条件的表项
由于Gorm涉及到的查询方式较多,这里只举一个查询指定用户密码的例子:
db.Table("user_login").Select("UserPwd").Where("UserName = ?", UserName).Find(&pwd)
用自然语言表达,上面的代码的意思是查找user_login表中UserName为变量UserName表项的Userpwd字段,同时字段被存储在pwd变量中。
更新数据
Gorm提供了类似sql子句update的函数db.update()实现数据更新。例如
db.Model(&food).Update("price", 25)
这段语句等价于UPDATE foods SET price = 25 WHERE foods.id = '2',指把id为2的食物的价格更新为25。另外,当我们使用Struct更新时只会更新非零值,若要更新零值需要使用map
删除数据
Gorm中可以通过db.Delete()与db.DeleteAt()删除表项。这两种方法是有区别的:前者是物理层面作删除,即将数据从数据库中清除;后者则是软删除,即数据依然存在于数据库中,但Gorm无法查询。
事务与Hook
Gorm提供了Tansaction方法用于自动提交事务,该方法可以有效避免用户漏写Commit等造成bug。同时Gorm提供了CURD的Hook能力以检测是否出错,若出错Gorm会自动终止执行并回滚事务。
总结
今天主要学习的Gorm的基本知识以及其对数据库的基本操作。在工程项目中提升数据库运行的效率对提升整个项目的效率,降低运维成本十分重要,因此要充分掌握,利用Gorm的特性,提升项目数据库的运行质量。