Gorm的使用 | 青训营笔记

297 阅读3分钟

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