实践:GORM入门使用 | 青训营

87 阅读4分钟

实践:GORM

一、GORM的安装和导入

首先我们需要在项目下下载安装GORM包:

go get -u gorm.io/gorm

其次还有对应使用的数据库驱动:

go get -u gorm.io/driver/mysql          //MySQL
​
go get -u gorm.io/driver/sqlite         //SQLite

然后我们在项目中导入包:

// 导入包
import (
  "gorm.io/gorm"
  "gorm.io/driver/mysql"
)

二、GORM的连接

首先,我们通过gorm.Open()创建一个数据库的连接:

func Open(dialector Dialector, opts ...Option) (db *DB, err error) {}
​
db, err := gorm.Open(
    mysql.Open("username:password@tcp(host:port)/databaseNamecharset=utf8mb4&parseTime=True&loc=Local"),     &gorm.Config{})

其中,第一个参数Dialector 是一个接口类型,用于表示数据库的方言(dialect),是指特定数据库的语法和特性。

每个数据库驱动(如mysql.Open())都会返回一个实现了 dialector 接口的结构体,用于与相应的数据库进行通信,它的参数是DSN,即数据源名称。

DSN是一个字符串,用于指定数据库的地址、端口、用户名、密码、名称等等信息。

第二个参数传入了一个空的配置,代表使用默认的配置。

连接成功后会返回一个*gorm.DB类型的值,代表了一个数据库连接会话,后续的操作都是通过它来完成的。

三、GORM的使用

定义数据模型

GORM中的一个数据模型代表一张数据表,由基本数据类型和实现了Scanner和Valuer接口的自定义类型及其指针或者别名组成,如:

type User struct {
    ID       uint
    password string
    Name     string
}

一般来说,数据表的每一条数据都包括了:自增主键、创建时间、更新时间与删除时间等通用字段,因此GORM将其定义为了gorm.Model,因此下面两个数据模型等价:

type User struct {
   gorm.Model
   Name      string
   PassWord  string
}
​
type User struct {
   ID        uint   `gorm:"primaryKey"`
   Name      string
   PassWord  string
   CreatedAt time.Time
   UpdatedAt time.Time
   DeletedAt    `gorm:"index"`
}

同时,我们可以在每条字段后定义标签,标签可以指定数据库表的列名、数据类型、约束等等信息,和数据库进行正确的映射:

type User struct {
    ID        uint `gorm:"primaryKey"`
    CreatedAt time.Time
    UpdatedAt time.Time
    Name      string `gorm:"column:username;unique;size:255"`
    PassWord  string `gorm:"type:varchar(100);default:123456"`
}
  • primaryKey 标签:用于指定字段是否是主键。
  • column` 标签:用于指定字段在数据库表中的列名。
  • type 标签:用于指定字段在数据库中的数据类型。
  • size 标签:用于指定字段在数据库中的大小限制,仅对字符串字段有效。
  • default 标签:用于指定字段在数据库中的默认值。
  • unique 标签:用于指定字段是否要创建唯一约束。

迁移(或者创建)数据表

GORM中,可以使用AutoMigrate()方法来迁移数据表,它会根据数据模型自动创建或更新数据库表结构。

如果表不存在,AutoMigrate()方法会创建一个新的表;如果表已经存在,它会根据模型的变化来更新表结构。

需要注意它并不会删除已有的列和数据。

type User struct {
   ID        uint `gorm:"primaryKey"`
   CreatedAt time.Time
   UpdatedAt time.Time
   Name      string `gorm:"column:username;unique;size:255"`
   PassWord  string `gorm:"type:varchar(100);default:123456"`
}
​
err = db.AutoMigrate(&User{})

image.png

数据库操作

创建数据

我们可以通过db.Create()来创建一条数据,并将其插入到数据库中保存:

user := User{Name: "Tom"}
if err := db.Create(&user).Error; err != nil {
   panic("failed to create a user")
}

image.png

查询数据

我们可以通过First()、Last()、Find()和Where()等方法来查询一条或者多条数据,这些方法都是基于*gorm.DB类型的值进行链式调用的,同时都会返回一个新的*gorm.DB类型的值,包括了查询条件和结果。

测试数据库内容如下:

image.png

First()

使用First()方法来查询第一条记录,它接受一个结构体的指针作为参数,然后将查询结果赋值给该结构体。如果没有找到匹配的记录,它会返回一个ErrRecordNotFound错误。

var user User
db.First(&user, 1)
db.First(&user, "ID=?", 1)

image.png

Last()

使用Last()方法来查询最后一条记录,和First()用法一致。

Find()

Find()方法来查询多条记录,它接受一个切片的指针作为参数,然后将查询结果追加到该切片中。

var users []User
db.Find(&users)

image.png

Where()

Where()方法可以用来指定过滤条件,它接受一个字符串、一个结构体、一个字典或一个切片作为参数,然后根据参数的类型和内容来生成对应的SQL语句,并执行它们。

var users []User
​
db.Where("username = ?", "Alice").Find(&users)
db.Where("password LIKE ?", "%456").Find(&users)

image.png

更新数据

更新数据需要使用Model()先指定需要更新的数据对象,然后使用Update()来进行更新,需要注意该方法只能更新单个字段,如果需要更新多个字段则需要使用Updates()

var user User
db.First(&user, 1)
​
db.Model(&user).Update("username", "Bob")

image.png

删除数据

通过Delete()方法来删除一条或多条记录。它接受一个结构体、一个切片或一个函数作为参数,然后根据参数的类型和内容来生成对应的SQL语句,并执行它们。

var user User
db.First(&user, 1)
​
​
db.Delete(&user)

image.png