Go工程实践 - GORM库的使用 | 青训营

79 阅读3分钟

开篇

GORM库官网

GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

官网介绍:

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
  • 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

快速开始

安装

go get -u gorm.io/gorm  
go get -u gorm.io/driver/mysql

连接到Mysql

GORM 官方支持的数据库类型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB。这里我选择MySQL作为快速入门的案例。

  1. 新建一个数据库gorm_study,采用默认配置
  2. 导入gorm库和MySQL驱动
  3. 创建连接
package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "root:12345678@tcp(127.0.0.1:3306)/gorm_study?charset=utf8mb4&parseTime=True&loc=Local"
	_, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if(err != nil){
		panic("连接失败" + err.Error())
	}
	fmt.Println("连接成功!")
}

增删改查

准备工作

声明模型

这就是我们接下来要操作的结构体

type User struct {
	ID   uint `gorm:"primaryKey"`
	Name string
	Age  uint8
}

创建表

在gorm_stydy中创建一张users表

CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

做完这些,准备工作就算完成了。

创建记录

user := User{Name: "zhangsan", Age: 18}
result := db.Create(&user)

创建记录使用Create方法,传值为模型的指针。

查询记录

GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误

user := User{}
// 获取第一条记录(主键升序)
db.First(&user)

// 获取一条记录,没有指定排序字段
db.Take(&user)

// 获取最后一条记录(主键降序)
db.Last(&user)

当然,还可以通过Where方法传递查询复杂的查询条件。

更新记录

Save 方法会保存所有的字段,即使字段是零值

user := User{}
db.First(&user)

user.Name = "张三"
user.Age = 20
db.Save(&user)

当然,也可以通过添加where条件来更新指定的列。

删除记录

删除分为物理删除和逻辑删除。如果模型包含了gorm.DeletedAt字段,那么该模型默认获得了逻辑删除的能力。此时,当调用Delete时,GORM并不会从数据库中删除该记录,而是将该记录的DeleteAt设置为当前时间,而后的一般查询方法将无法查找到此条记录。

显然,测试的模型并没有包含这个字段,所以,调用delete方法就是真正的删除记录。

删除一条记录时,删除对象需要指定主键,否则会触发批量删除。

user := User{ID: 1}
db.Delete(&user)

// 带额外条件的删除
db.Where("name = ?", "zhangsan").Delete(&user)

结尾

本文简单的使用 GORM(Go 的 ORM 库)连接数据库,并实现基础的增删改查操作。

更多高级的用法就自行查看官方文档。