GORM基本用法
GORM基本用法
详细内容
GORM 概述
GORM 是一个适用于 Golang 的功能齐全的 ORM(对象关系映射)库。它简化了数据库操作,将数据库中的表映射为 Golang 结构体,并通过代码实现常见的 SQL 操作,如查询、插入、更新和删除等。
GORM 的特点:
- 全功能 ORM:支持 CRUD(增删查改)、事务、关联关系、钩子函数、预加载等。
- 数据库支持:支持 MySQL、PostgreSQL、SQLite、SQL Server 等数据库。
- 链式调用:提供链式调用方式编写 SQL 查询,代码简洁清晰。
- 迁移功能:提供数据库自动迁移能力,可自动创建或更新表结构。
基本用法
1. 安装 GORM
首先需要安装 GORM 及对应的数据库驱动程序(以 MySQL 为例):
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
2. 初始化数据库连接
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
func main() {
// 配置数据库连接信息
dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
// 初始化数据库连接
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("数据库连接失败:", err)
}
log.Println("数据库连接成功!")
}
3. 定义模型(结构体)
GORM 使用结构体映射数据库中的表。示例定义一个 User
结构体:
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Email string `gorm:"unique"`
Age int
}
4. 自动迁移(Auto Migrate)
GORM 提供自动迁移功能,根据结构体生成数据库表。
db.AutoMigrate(&User{})
这里通过AutoMigrate生成的表,其表名是GORM根据我们的类名推导出来的,把类名User变成复数形式Users,就得到了表名。
5. 插入数据
使用 Create
方法插入一条数据:
user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
result := db.Create(&user)
if result.Error != nil {
log.Println("插入失败:", result.Error)
} else {
log.Printf("成功插入用户,ID: %d", user.ID)
}
6. 查询数据
var user User
// 查询单条记录
db.First(&user, 1) // 根据主键查询
db.First(&user, "email = ?", "alice@example.com")
// 查询多条记录
var users []User
db.Where("age > ?", 20).Find(&users)
7. 更新数据
// 更新用户的 Email
db.Model(&user).Update("Email", "newalice@example.com")
// 批量更新
db.Model(&user).Updates(User{Name: "Alice Updated", Age: 26})
8. 删除数据
// 根据主键删除
db.Delete(&user, 1)
// 根据条件删除
db.Where("age > ?", 30).Delete(&User{})
9. 关联关系
GORM 支持常见的数据库关联关系(如一对一、一对多、和多对多)。
示例:User
和 Order
的一对多关系:
type Order struct {
ID uint
UserID uint
Amount float64
}
type User struct {
ID uint
Name string
Orders []Order `gorm:"foreignKey:UserID"`
}
db.AutoMigrate(&User{}, &Order{})
10. 使用事务
err := db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(&User{Name: "Bob"}).Error; err != nil {
return err
}
if err := tx.Create(&Order{UserID: 1, Amount: 100.0}).Error; err != nil {
return err
}
return nil // 返回 nil 表示提交事务
})
if err != nil {
log.Println("事务失败:", err)
} else {
log.Println("事务成功")
}
总结
GORM 提供了简单易用的 API,帮助 Golang 开发者专注于业务逻辑而非数据库操作。通过定义结构体并使用链式调用,GORM 让 SQL 操作更直观,同时支持复杂的查询、关联关系和事务处理,适用于多种数据库和项目场景。
表名管理
是的,GORM 会自动推断模型结构体所对应的数据库表名。默认情况下,表名是根据结构体名称的复数形式确定的。
表名的推断规则
-
默认规则:
- GORM 会将模型结构体名称转换为小写的复数形式作为表名。例如:
User
→users
Product
→products
- GORM 会将模型结构体名称转换为小写的复数形式作为表名。例如:
-
表名格式的转换:
- GORM 会根据英文的复数规则转换。例如:
Category
→categories
Company
→companies
- 如果不符合复数规则(如外来词),可以手动设置表名。
- GORM 会根据英文的复数规则转换。例如:
自定义表名
如果你不希望使用 GORM 的自动复数规则,可以手动指定表名。有两种常见的方法:
- 在结构体上使用
TableName()
方法。 - 在 GORM 配置中禁用复数表名。
1. 使用 TableName()
方法
在模型结构体中添加 TableName()
方法,可以覆盖 GORM 自动推断的表名。
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Email string `gorm:"unique"`
Age int
}
// 自定义表名方法
func (User) TableName() string {
return "custom_user_table"
}
这样,GORM 会将表名设为 "custom_user_table"
。
2. 禁用复数表名(全局配置)
你还可以在 GORM 初始化时禁用自动复数表名:
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true, // 禁用复数表名
},
})
此时,GORM 会直接使用结构体的名称作为表名,而不会自动加复数。例如:
User
→user
总结
默认情况下,GORM 会将 User
结构体映射到名为 users
的表中(复数形式)。如果不想使用默认的复数规则,你可以通过实现 TableName()
方法或在配置中禁用复数表名来自定义表名。