这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
go语言可以使用gorm操作数据库
安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
模型定义
模型定义
模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成
type User struct {
Id int
Name string
Sal int
Job string
Deptno string
}
gorm.Model
GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt
// gorm.Model 的定义
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
您可以将它嵌入到您的结构体中,以包含这几个字段,详情请参考 嵌入结构体
注意:
如果你在结构体中加入了gorm.Model;
gorm将会默认进行软删除,你需要保证你的数据库可以与其适应
高级选项
你可以设置:
- 字段级权限控制
- 创建/更新时间追踪(纳秒、毫秒、秒、Time)
- 嵌入结构体
- 字段标签
上述选型可去官方文档查看👉
连接数据库
此处以MySQL为准,其他数据库(GORM官方支持MySQL, PostgreSQL, SQlite, SQL Server)快去官方文档查看
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
其中:
- user : 用户名
- pass : 对应的密码
- (127.0.0.1:3306) : ip地址和端口号
- dbname : 数据库名称
- 加入parseTime以处理time.Time
- charset=utf8以支持完整的UTF-8编码
- 更多参数请看->github.com/go-sql-driv…
GORM 也可以通过一个现有的数据库连接来初始化
import (
"database/sql"
"gorm.io/driver/mysql"
"gorm.io/gorm"
_ "example.com/my_mysql_driver"
)
sqlDB, err := sql.Open("mysql", "mydb_dsn")
gormDB, err := gorm.Open(mysql.New(mysql.Config{ DriverName: "my_mysql_driver", Conn: sqlDB,}), &gorm.Config{})
GORM 允许通过 DriverName 选项自定义 MySQL 驱动
如上👆
CRUD
创建
newUser := User{
Id: 1,
Name: "小红",
Sal: 3000,
Job: "刷碗",
}
result := db.Table("my_table02").Create(&newUser)
if result.Error != nil {
panic(result.Error)
}
fmt.Println(result.RowsAffected, "rows have changed")
- result.Error:error
- result.RowsAffected 插入记录的条数
用指定的字段进行创建
db.Select("Id", "Name", "Sal","Job").Create(&newUser)
同时类似的可以通过指定忽略字段进行创建
db.Omit("Job").Create(&newUser)
批量创建
要有效地插入大量记录,请将一个 slice 传递给 Create 方法。 GORM 将生成单独一条SQL语句来插入所有数据,并回填主键的值
var users = []User{{Name: "User1"}, {Name: "User2"}, {Name: "User3"}}
db.Create(&users)
for _, user := range users {
user.ID // 1,2,3
}
查询
查多个
Find
var users []User
//result := db.Table("my_table02").Where("id=?", 100).Find(&users)
result := db.Table("my_table02").Find(&users)
if result.Error != nil {
panic(result.Error)
}
fmt.Println(result.RowsAffected, "rows have found")
for _, user := range users {
fmt.Println(user.toString())
}
其中:
db.Table("my_table02") 为指定表名
当然可以使用db.AutoMigrate(&User{})进行绑定
查一个
GORM 提供了 First、Take、Last 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误
- First : 第一个
- Take : 任一个
- Last : 最后一个
更新
更新单列
update
更新指定的字段名
db.Table("my_table02").Where("id = ?", 1).Update("Name", "小明")
更新多列
db.Table("my_table02").Where("id = ?", 1).Updates(User{Name: "hello", Age: 18, Active: false})
更新全列
db.Table("my_table02").Where("Sal = ?", nil).Model(&newUser)
删除
删除一条记录时,删除对象需要指定主键,否则会触发批量删除
主键删除
db.Table("my_table02").Delete(newUser)
批量删除
如果指定的值不包括主属性,那么 GORM 会执行批量删除,它将删除所有匹配的记录
db.Table("my_table02").Where("name = ?", "小鸣").Delete(User{})