实践: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{})
数据库操作
创建数据
我们可以通过db.Create()来创建一条数据,并将其插入到数据库中保存:
user := User{Name: "Tom"}
if err := db.Create(&user).Error; err != nil {
panic("failed to create a user")
}
查询数据
我们可以通过First()、Last()、Find()和Where()等方法来查询一条或者多条数据,这些方法都是基于*gorm.DB类型的值进行链式调用的,同时都会返回一个新的*gorm.DB类型的值,包括了查询条件和结果。
测试数据库内容如下:
First()
使用First()方法来查询第一条记录,它接受一个结构体的指针作为参数,然后将查询结果赋值给该结构体。如果没有找到匹配的记录,它会返回一个ErrRecordNotFound错误。
var user User
db.First(&user, 1)
db.First(&user, "ID=?", 1)
Last()
使用Last()方法来查询最后一条记录,和First()用法一致。
Find()
Find()方法来查询多条记录,它接受一个切片的指针作为参数,然后将查询结果追加到该切片中。
var users []User
db.Find(&users)
Where()
Where()方法可以用来指定过滤条件,它接受一个字符串、一个结构体、一个字典或一个切片作为参数,然后根据参数的类型和内容来生成对应的SQL语句,并执行它们。
var users []User
db.Where("username = ?", "Alice").Find(&users)
db.Where("password LIKE ?", "%456").Find(&users)
更新数据
更新数据需要使用Model()先指定需要更新的数据对象,然后使用Update()来进行更新,需要注意该方法只能更新单个字段,如果需要更新多个字段则需要使用Updates()。
var user User
db.First(&user, 1)
db.Model(&user).Update("username", "Bob")
删除数据
通过Delete()方法来删除一条或多条记录。它接受一个结构体、一个切片或一个函数作为参数,然后根据参数的类型和内容来生成对应的SQL语句,并执行它们。
var user User
db.First(&user, 1)
db.Delete(&user)