这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
ORM
ORM在每个编程语言中都很常见,它用来表示对象之间的关系。在实际开发过程中,我们会经常需要定义一些实体类,并将其持久化存储到数据库中。在初学数据库时,经常都是手写sql指令对数据库进行操作。但是有了ORM的帮助,可以快速地将实体类的数据,序列化存储到数据库中。同样,在读取数据时,也可以使用ORM提供的封装快速对数据进行检索,并获取实体对象。
GORM
GORM就是在go语言中实现了ORM的库。根据其在官网的介绍,GORM主要有以下优势:
- 全功能的ORM库
- 支持关联
- 支持HOOK
- 支持事务
- 支持批量操作
- 拓展性高
- ···
在我们日常使用中,使用GORM可以极大地提高我们程序开发的速度。
安装
使用命令进行安装,根据数据库类型不同安装不同的驱动。
go get gorm.io/gorm
go get gorm.io/driver/sqlite
go get gorm.io/driver/mysql
创建连接
在开始使用GORM之前,首先需要建立对数据库的连接,这里我使用的是MySQL数据库。
Db, err = gorm.Open(mysql.Open(fmt.Sprintf("%s:%s@%s(%s)/%s?charset=%s&parseTime=%v&loc=%s",
DbConf.Username,
DbConf.Password,
DbConf.Net,
DbConf.Addr,
DbConf.DbName,
DbConf.Charset,
DbConf.ParseTime,
DbConf.Loc,
)), &gorm.Config{})
其中DbConfig是一个配置实体,用于从配置文件读取数据库连接信息。一般在实际运用中,都会使用配置文件的方式来读取数据库等配置项信息。下方的代码便使用了toml来读取配置项。
type Mysql struct {
Username string
Password string
Net string
Addr string
DbName string
Charset string
ParseTime bool `toml:"parse_time"`
Loc string
}
type Config struct {
DB Mysql `toml:"mysql"`
}
var Conf Config
func init(){
if _, err := toml.DecodeFile("./config/conf.toml", &Conf); err != nil {
panic(fmt.Errorf("cannot decode config file: %s", err))
}
}
conf.toml
[mysql]
username = "test"
password = "pwd"
net = "tcp"
addr = "localhost"
dbname = "root"
charset = "utf8mb4"
parse_time = true
loc = "Local"
编写实体
ORM是需要实体和数据库进行映射的,所以我们需要给需要和数据库交互的数据编写实体类。
type User struct {
ID int
Name string `gorm:"type:varchar(32) not null;uniqueIndex"`
Password string `gorm:"type:varchar(255) not null;"`
}
例如这是一个User实体类,定义了用户的ID、用户名和密码。使用gorm可以在struct中自定义这个字段的sql字段信息。例如这里在Name和Password字段上设置其为varchar,限制大小,是否为null,是否有索引。
其中,ID项是gorm默认的一个自增ID字段,我们只需要将其字段命名为ID,gorm会自动将其作为自增ID主键进行处理,无需进行额外设置。
GORM中还有一些预定义的字段,ID就是其中之一。我们可以在struct中引用gorm.Model,来继承一些其他的默认字段。
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
| 字段 | 用途 |
|---|---|
| ID | 自增ID主键 |
| CreatedAt | 记录row的创建时间 |
| UpdatedAt | 记录row的更新时间 |
| DeletedAt | 如果使用gorm提供的删除方法,会把这个字段的值设置为删除的时间,而非使用SQL的DELETE指令 |
Migrate
在创建完实体之后,如果不使用ORM,我们应该要给sql设计表结构并建表。但是在GORM中,我们只需要使用AutoMirgrate方法,自动对sql表中的DDL进行更新。
Db.AutoMigrate(&User{})
CRUD
// Create
Db.Create(&User{Name: "test", Password: "testPwd"})
// Read
var user User
Db.First(&user, 1) // 通过ID主键查找
Db.First(&user, "name = ?", "test") // 限制WHERE条件进行查找
// Update
Db.Model(&user).Update("password", "newPwd")
// Update - 多字段
Db.Model(&user).Updates(User{Name: "newName", Password: "newPwd"})
Db.Model(&user).Updates(map[string]interface{}{"Name": "newName", "Password": "newPwd"})
// Delete
Db.Delete(&user, 1)
使用Db下的上述方法,就可以快速对实体进行CRUD操作。