在 Go 语言开发中,数据库操作是每个开发者都无法绕开的话题。而 GORM 作为一款功能强大、设计优雅的 ORM 库,凭借其简洁的 API 和丰富的功能,成为了 Go 开发者的首选工具。无论你是新手还是老手,掌握 GORM 的 API 都能让你的开发效率提升数倍!
今天,我们将深入探讨 GORM 的所有核心 API,带你从入门到精通,彻底掌握 GORM 的奥秘!
GORM 不仅仅是一个 ORM 工具,它更像是一个数据库操作的瑞士军刀。以下是 GORM 的核心优势:
接下来,我们将从 初始化、模型定义、CRUD 操作、高级功能 四个方面,全面解析 GORM 的 API!
GORM 支持多种数据库,以下是连接 MySQL 的示例:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
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 {
panic("failed to connect database")
}
fmt.Println("Database connected!")
}
GORM 提供了丰富的配置选项,例如日志级别、表前缀等:
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info), // 设置日志级别
NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_", // 表前缀
},
})
GORM 使用结构体来定义模型,每个字段可以通过标签(Tag)指定数据库约束:
type User struct {
gorm.Model // 内嵌 gorm.Model,包含 ID、CreatedAt、UpdatedAt、DeletedAt
Name string `gorm:"type:varchar(100);not null"`
Age int `gorm:"default:18"`
Email string `gorm:"uniqueIndex"`
}
GORM 可以根据模型自动创建或更新表结构:
db.AutoMigrate(&User{}) // 自动创建 users 表
// 创建单条记录
user := User{Name: "John", Age: 20}
result := db.Create(&user) // 返回 *gorm.DB
fmt.Println(user.ID) // 获取插入的主键
// 批量创建
users := []User{{Name: "Alice"}, {Name: "Bob"}}
db.Create(&users)
// 查询单条记录
var user User
db.First(&user, 1) // 根据主键查询
db.First(&user, "name = ?", "John") // 条件查询
// 查询多条记录
var users []User
db.Find(&users) // 查询所有记录
db.Where("age > ?", 18).Find(&users) // 条件查询
// 查询特定字段
db.Select("name", "age").Find(&users)
// 排序和分页
db.Order("age desc").Limit(10).Offset(0).Find(&users)
// 更新单条记录
db.Model(&user).Update("Age", 21)
// 更新多个字段
db.Model(&user).Updates(User{Name: "Alice", Age: 22})
// 批量更新
db.Model(&User{}).Where("age < ?", 18).Update("age", 20)
// 删除单条记录
db.Delete(&user)
// 根据主键删除
db.Delete(&User{}, 1)
// 批量删除
db.Where("age < ?", 18).Delete(&User{})
GORM 支持手动和自动事务:
// 手动事务
tx := db.Begin()
if err := tx.Create(&User{Name: "John"}).Error; err != nil {
tx.Rollback()
return
}
tx.Commit()
// 自动事务
db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(&User{Name: "John"}).Error; err != nil {
return err
}
return nil
})
GORM 提供了模型生命周期钩子,可以在特定时间点执行自定义逻辑:
func (u *User) BeforeCreate(tx *gorm.DB) error {
u.CreatedAt = time.Now()
return nil
}
func (u *User) AfterDelete(tx *gorm.DB) error {
fmt.Println("User deleted:", u.ID)
return nil
}
type Order struct {
gorm.Model
UserID uint
User User
}
var orders []Order
db.Preload("User").Find(&orders) // 预加载关联的 User 数据
GORM 支持执行原生 SQL 语句:
var users []User
db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)
db.Exec("UPDATE users SET age = ? WHERE name = ?", 20, "John")
type Profile struct {
gorm.Model
UserID uint
User User
}
type User struct {
gorm.Model
Profile Profile
}
type Order struct {
gorm.Model
UserID uint
User User
}
type User struct {
gorm.Model
Orders []Order
}
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
Users []User `gorm:"many2many:user_languages;"`
}
GORM 支持软删除,记录不会被真正删除,而是设置 DeletedAt 字段:
db.Delete(&user) // 软删除
db.Unscoped().Delete(&user) // 硬删除
func (User) TableName() string {
return "custom_users"
}
GORM 的 API 设计简洁而强大,覆盖了数据库操作的方方面面。无论是简单的 CRUD 操作,还是复杂的关联查询和事务处理,GORM 都能轻松应对。通过熟练掌握这些 API,你可以大幅提升开发效率,写出更优雅、更高效的 Go 代码。
如果你对某个功能有更深入的需求,可以参考 GORM 官方文档 获取更多详细信息。希望这篇指南能帮助你彻底掌握 GORM,成为数据库操作的终极高手!
立即尝试 GORM,让你的 Go 语言开发飞起来! 🚀
欢迎关注我的公众号“全栈开发ck”,原创技术文章第一时间推送。