开篇
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 中钩子方法
- 支持
Preload、Joins的预加载 - 事务,嵌套事务,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作为快速入门的案例。
- 新建一个数据库gorm_study,采用默认配置
- 导入gorm库和MySQL驱动
- 创建连接
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 提供了 First、Take、Last 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 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 库)连接数据库,并实现基础的增删改查操作。
更多高级的用法就自行查看官方文档。