GORM 基础
安装 GORM
首先,你需要安装 GORM。在你的 Go 项目中运行以下命令:
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
这里我们使用了 SQLite 作为示例数据库,你也可以选择 MySQL、PostgreSQL 等其他数据库。
定义模型
定义一个 Go 结构体来表示数据库中的表。例如,我们定义一个 User 模型:
package main
import (
"gorm.io/gorm"
)
type User struct {
gorm.Model
Name string
Email string `gorm:"type:varchar(100);uniqueIndex"`
Age int
}
这里 gorm.Model 是 GORM 的内置模型,包含了 ID、CreatedAt、UpdatedAt、DeletedAt 等字段。
连接数据库
使用 GORM 连接到数据库:
package main
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 迁移模式
db.AutoMigrate(&User{})
}
增删改查操作
创建(Create)
创建一个新的记录:
func main() {
// 省略连接数据库的代码
// 创建用户
user := User{Name: "John Doe", Email: "johndoe@example.com", Age: 30}
db.Create(&user)
// 查询并打印创建的用户
var user1 User
db.First(&user1, user.ID)
println(user1.Name)
}
查询(Read)
查询数据库中的记录:
func main() {
// 省略连接数据库的代码
// 查询所有用户
var users []User
db.Find(&users)
// 查询特定用户
var user User
db.First(&user, 1) // 根据ID查询
db.First(&user, "name = ?", "John Doe") // 根据条件查询
}
更新(Update)
更新记录:
func main() {
// 省略连接数据库的代码
// 更新用户
db.Model(&user).Update("Age", 31)
db.Model(&user).Updates(User{Age: 40, Email: "newemail@example.com"})
}
删除(Delete)
删除记录:
func main() {
// 省略连接数据库的代码
// 删除用户
db.Delete(&user, 1)
}
事务
GORM 也支持事务操作:
func main() {
// 省略连接数据库的代码
tx := db.Begin()
if tx.Error != nil {
tx.Rollback()
return
}
if err := tx.Create(&user).Error; err != nil {
tx.Rollback()
return
}
tx.Commit()
}
关联
GORM 支持一对一、一对多、多对多的关联:
type Profile struct {
gorm.Model
User User
Value string
}
func main() {
// 省略连接数据库的代码
// 创建用户和关联的 Profile
db.Create(&User{Name: "Jane Doe", Email: "janedoe@example.com"})
db.Model(&User{Name: "Jane Doe"}).Association("Profile").Append(&Profile{Value: "Jane's profile"})
}
钩子(Hooks)
GORM 支持在数据库操作前后执行自定义逻辑:
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
u.CreatedAt = time.Now()
u.UpdatedAt = time.Now()
return nil
}
func main() {
// 省略连接数据库的代码
db.Create(&User{Name: "John Doe", Email: "johndoe@example.com"})
}
GORM高级特性
GORM 提供了许多高级特性,可以帮助开发者更高效地进行数据库操作。以下是一些值得学习的 GORM 高级特性:
- 多数据库支持:GORM 支持多种数据库,如 MySQL、PostgreSQL、SQLite 等,使用统一的 API 进行操作 。
- 关联(Relationships):GORM 支持多种关联类型,包括一对一(Has One)、一对多(Has Many)、多对多(Many To Many)等 。
- 预加载(Preload):GORM 支持预加载关联数据,以避免 N+1 查询问题,提高性能 。
- 事务处理:GORM 提供了事务支持,包括嵌套事务、保存点和回滚到保存点 。
- 上下文(Context):GORM 支持使用 Context 进行数据库操作,这有助于处理超时和取消操作 。
- 批量操作:GORM 支持批量插入、批量查询等操作,可以提高大量数据处理的效率 。
- SQL 构建器:GORM 提供了一个强大的 SQL 构建器,可以构建复杂的查询 。
- 复合主键支持:GORM 支持复合主键,允许你在一个表中有多个主键 。
- 索引和约束:GORM 允许你定义索引和数据库约束,以优化查询性能和保证数据完整性 。
- 自动迁移(Auto Migration):GORM 可以自动迁移数据库模式,简化数据库结构的更新 。
- 自定义 Logger:GORM 允许自定义日志记录器,以满足不同的日志需求 。
- 插件系统:GORM 提供了一个灵活的插件系统,如数据库解析器(Database Resolver)和 Prometheus 集成 。
- 命名策略:GORM 允许通过覆盖默认的命名策略来更改默认的命名约定,包括表名、字段名等 。
- 乐观锁:GORM 支持乐观锁,可以在并发环境下保证数据的一致性 。
- 字段权限:GORM 支持字段权限控制,如只读、只写、只创建、只更新、忽略等 。
- 自定义类型:GORM 优化了对自定义类型的支持,允许定义一个 struct 来支持所有类型的数据库 。
- Smart Select:GORM 允许通过选择指定的字段来优化查询,减少数据传输 。