GORM 是一个强大的 ORM 库,它为 Go 开发者提供了一个简单而有效的方式来与数据库交互,全功能 ORM、预加载、Context、预编译、批量插入等各种特性,本节将从安装到基本的查询开始介绍gorm的使用
参考官方文档:https://gorm.io/zh_CN/docs/
1. GORM 的安装流程 要在 Go 项目中使用 GORM,我们首先需要安装这个包。以下是基本的安装流程:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
在安装完 GORM 和相应的数据库驱动后,你就可以在你的 Go 项目中导入并使用它了。
2. 模型声明 GORM 使用 Go 的结构体来声明模型。这些模型与数据库中的表相对应。以下是一个简单的用户模型声明示例:
package main
import (
"gorm.io/gorm"
)
// 定义 User 模型,它代表数据库中的 users 表
type User struct {
gorm.Model // 内嵌 gorm.Model 结构体,它包含了一些基础字段
Name string
Age int
Email string `gorm:"type:varchar(100);unique_index"`
IsActive bool
}
func main() {
db, err := gorm.Open("mssql", "sqlserver://username:password@localhost:1433?database=dbname")
defer db.Close()
// 迁移 schema
db.AutoMigrate(&Product{})
// Create
db.Create(&User{Name: "张张", Age: 18})
// Read
var user User
db.First(&user, 1) // 根据整型主键查找
db.First(&user, "age = ?", 18) // 查找 age 字段值为 18 的记录
// update 更新
db.Model(&user).Update("age", 20)
// Update - 更新多个字段
db.Model(&user).Updates(User{age: 25, Name: "丽丽"})
// Delete - 删除
db.Delete(&user, 1)
}
结构体标记(Tag)
结构体标记 | 描述 |
---|---|
Column |
指定列名 |
Type |
指定列数据类型 |
Size |
指定列大小, 默认值255 |
PRIMARY_KEY |
将列指定为主键 |
UNIQUE |
将列指定为唯一 |
DEFAULT |
指定列默认值 |
PRECISION |
指定列精度 |
NOT NULL |
将列指定为非 NULL |
AUTO_INCREMENT |
指定列是否为自增类型 |
INDEX |
创建具有或不带名称的索引, 如果多个索引同名则创建复合索引 |
UNIQUE_INDEX |
和 INDEX 类似,只不过创建的是唯一索引 |
EMBEDDED |
将结构设置为嵌入 |
EMBEDDED_PREFIX |
设置嵌入结构的前缀 |
- |
忽略此字段 |
关联相关标记(tags)
结构体标记 | 描述 |
---|---|
MANY2MANY |
指定连接表 |
FOREIGNKEY |
设置外键 |
ASSOCIATION_FOREIGNKEY |
设置关联外键 |
POLYMORPHIC |
指定多态类型 |
POLYMORPHIC_VALUE |
指定多态值 |
JOINTABLE_FOREIGNKEY |
指定连接表的外键 |
ASSOCIATION_JOINTABLE_FOREIGNKEY |
指定连接表的关联外键 |
SAVE_ASSOCIATIONS |
是否自动完成 save 的相关操作 |
ASSOCIATION_AUTOUPDATE |
是否自动完成 update 的相关操作 |
ASSOCIATION_AUTOCREATE |
是否自动完成 create 的相关操作 |
ASSOCIATION_SAVE_REFERENCE |
是否自动完成引用的 save 的相关操作 |
PRELOAD |
是否自动完成预加载的相关操作 |
3. 数据库操作 创建 (Create) 要在数据库中创建一个新记录,可以使用 Create 方法:
db.Create(&User{Name: "John Doe", Age: 30, Email: "johndoe@example.com", IsActive: true})
查询 (Query) 基本查询 基本的查询可以用 Find 和 First 方法来完成:
var user User
db.First(&user) // 查询第一条记录
var users []User
db.Find(&users) // 查询所有记录
高级查询 使用 Where 方法进行条件查询:
var user User
db.Where("age > ?", 20).First(&user) // 查询年龄大于 20 的第一个用户
var users []User
db.Where("name = ?", "John Doe").Find(&users) // 查询名为 John Doe 的所有用户
还有类似laravel的FirstOrInit、FirstOrCreate、CreateInBatches、Upsert用法,具体可看官网案例说明
更新 (Update) 更新记录可以使用 Save 或者 Update 方法:
db.Model(&user).Update("Email", "newemail@example.com") // 更新用户的 Email
db.Model(&user).Updates(User{Name: "Jane Doe", Age: 25}) // 批量更新字段
删除 (Delete) 使用 Delete 方法删除记录:
db.Delete(&user) // 根据主键删除用户
4. 原始 SQL 和 SQL 生成器 原始 SQL 可以使用 Raw 和 Exec 方法执行原始 SQL 语句来查询或更改数据:
db.Raw("SELECT name, age FROM users WHERE name = ?", "John Doe").Scan(&user)
db.Exec("DELETE FROM users WHERE age = ?", 20)
SQL 生成器 GORM 的 SQL 生成器允许链式调用多个方法来构建 SQL:
db.Select("name", "age").Where("name = ?", "John Doe").Find(&user)
钩子函数 HOOK gorm提供了BeforeSave, BeforeCreate, AfterSave, AfterCreate三种类型的钩子函数,分别代表保存前、创建前、保存后、创建后的动作。比如创建前:
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
u.UUID = uuid.New()
if u.Role == "admin" {
return errors.New("invalid role")
}
return nil
}
如果您喜欢我的文章,请点击下面按钮随意打赏,您的支持是我最大的动力。
最新评论