使用 GORM 实现增删改查操作 | 青训营笔记
本文使用
postgres数据库,postgres与Mysql语法大致相同
安装
安装分两步骤:
- 安装 GORM 本体
go get gorm.io/gorm
- 安装 GORM 的对应数据库驱动, 此文章使用
postgres
go get gorm.io/driver/postgres
使用
Create
GORM的Create
插入数据, 类似 SQL 语句:
INSERT INTO <tablename> (key1, keyN) VALUES(value1, valueN)
语法:
db.Create(&struct)
解析:
db: 即GORM的gorm*DB初始化的变量
Create: GORM的创建函数
&struct: 结构体的地址
Read (查询)
查询单条记录
GORM的First方法用于查询满足条件的第一条记录,并将结果存储到指定的结构体变量中。
goCopy code
// 查询单条记录
var p1 Product
db.First(&p1, 1)
查询多条记录
GORM的Find方法用于查询满足条件的所有记录,并将结果存储到指定的切片变量中。
goCopy code
var prods []Product
// 条件查询多条记录
db.Find(&prods, "Code > ?", 2)
// 全部查询多条记录
db.Find(&prods)
Update (更新)
更新单条记录
GORM的Save方法用于更新指定的记录。
goCopy code
// 更新单条记录
var p1 Product
db.First(&p1, 1)
p1.Code = "new_code"
db.Save(&p1)
批量更新
GORM的Update方法用于批量更新满足条件的记录。
goCopy code
// 批量更新
db.Model(&Product{}).
Where("Code > ?", 1).
Update("Code", "new_code")
Delete (删除)
删除单条记录
GORM的Delete方法用于删除指定的记录。
goCopy code
// 删除单条记录
var p1 Product
db.First(&p1, 1)
db.Delete(&p1)
批量删除
GORM的Delete方法也可以用于批量删除满足条件的记录。
goCopy code
// 批量删除
db.Where("Code = ?", 2).Delete(&Product{})
测试先行
package test
import (
"fmt"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"testing"
)
var (
HOST = "139.198.165.123"
USER = "postgres"
PASSWORD = "pass"
PORT = "30000"
DATABASE = "postgres"
SslMode = "disable"
TimeZone = "Asia/Shanghai"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func TestGORM(t *testing.T) {
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=%s TimeZone=%s", HOST, USER, PASSWORD, DATABASE, PORT, SslMode, TimeZone)
db, err := gorm.Open(postgres.New(
postgres.Config{
DSN: dsn,
PreferSimpleProtocol: false,
}))
if err != nil {
t.Errorf("启动失败:%s", err)
}
// 建表, 默认表名为结构体小写+s
err = db.AutoMigrate(&Product{})
if err != nil {
t.Errorf("迁移失败:%s", err)
}
// 创建数据
db.Create(&Product{
Code: "1231",
Price: 10,
})
// 批量插入
db.Create([]Product{{
Code: "1",
Price: 110,
}, {
Code: "2",
Price: 120,
},
})
// 单条更新
var p1 Product
db.First(&p1, 1).
Model(&p1).
Update("Code", 22)
// 批量更新
db.Model(&p1).
Where("Code > ?", 1).
Update("Code", 22)
// 单条查询
db.First(&p1, 1)
t.Logf("单条查询:%v", p1)
var prods []Product
// 条件查询
db.Find(&prods, "Code > ?", 2)
t.Logf("prods:%v", prods)
// 全部查询
db.Find(&prods)
t.Logf("prods:%v", prods)
// 单个条件删除
db.First(&p1, 1).Delete(&p1)
// 批量删除
db.Where("Code =", 2).Delete(&Product{})
defer func() {
// 删表
err = db.Migrator().DropTable(&Product{})
if err != nil {
t.Errorf("删表失败%s", err)
}
}()
}