这是我参与「第五届青训营 」笔记创作活动的第9天。
在后端青训营进阶班的课程中,我接触到了GORM这一GO语言中与数据库进行交互的利器,在此分享一下我使用过程中的一些心得。
连接数据库
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?&parseTime=true", dbUser, dbPass, dbHost, dbPort, dbName)
fmt.Println(dsn)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
以常用的mysql数据库为例。首先要拼接连接数据库的命令。User为用户名,Pass为密码,Host为域名,Port为端口,Name为使用的数据库名(相当于连接后执行了use dbName;)。最后的parseTime=true是为了之后能正确处理时间类型的数据。
然后调用mysql驱动的Open函数,并指定配置;将这两者作为参数调用gorm.Open()。配置中的logger项指定了日志级别为最低的logger.Info,即会输出每一次调用的原始sql语句,便于调试。
模型定义
顾名思义,GORM就是使用了ORM(Object Relational Mapping,对象关系映射)技术。每个对象对应一条记录,相应的,其所属struct就定义了表结构,比如:
type Student struct {
gorm.Model
Name string
}
其中gorm.Model的定义:
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
ID的tag表示此列为主键,DeleteAt的tag表示此列为索引。更多的tag选项包括指定列名、指定数据类型、定义为唯一键、设置默认值、嵌套结构体等。
最后建出的表长这样:
mysql> desc students;
+------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| created_at | datetime(3) | YES | | NULL | |
| updated_at | datetime(3) | YES | | NULL | |
| deleted_at | datetime(3) | YES | MUL | NULL | |
| name | longtext | YES | | NULL | |
+------------+---------------------+------+-----+---------+----------------+
GORM在创建记录的时候会自动更新create_at字段,在更新操作的时候会自动更新updated_at字段,在软删除(默认)的时候会自动更新deleted_at字段。
基础增删改查操作
既然是ORM,那么增删改查操作也离不开对象。
创建记录
res := db.Create(&stu)
若res.Error为nil,表示sql语句执行成功。那么此处就创建成功了一条各字段值等同于stu(为Student结构体的对象)相应成员的记录。
删除记录
res := db.Delete(&stu)
会删除主键与stu相同的记录,若res.Error为nil,表示删除语句执行成功,但是有可能一条记录都没删掉。
修改记录
res := db.Save(&stu)
将主键与stu相同的记录的所有字段值修改为stu相应成员的值。如果该记录不存在,会新建一条记录,因此也可以用它来创建记录。
查询记录
res := db.First(&stu, 3)
First会查询满足条件的第一条记录,存进stu里(因此记得传它的地址进去,不然没法给stu赋值),第二个参数3为查找主键为3的记录。
如果查不到,res.Error为gorm.ErrRecordNotFound。