使用 GORM 实现增删改查操作 | 青训营笔记

149 阅读2分钟

使用 GORM 实现增删改查操作 | 青训营笔记

本文使用postgres数据库, postgresMysql语法大致相同

安装

安装分两步骤:

  1. 安装 GORM 本体
go get gorm.io/gorm
  1. 安装 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)
            }
	}()

}