初识GORM | 青训营笔记

69 阅读2分钟

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