GORM 是 Go 语言最流行的 ORM 框架,封装了
database/sql
,支持自动迁移、关联关系、事务等功能,开发体验接近于高层语言的 ORM。
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
# PostgreSQL 用户:
# go get -u gorm.io/driver/postgres
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
func main() {
dsn := "user:password@tcp(127.0.0.1:3306)/gormdb?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("连接数据库失败:", err)
}
log.Println("连接成功")
}
type User struct {
ID uint `gorm:"primaryKey"`
Name string
Email string `gorm:"uniqueIndex"`
Age int
CreatedAt time.Time
}
id
、created_at
等字段。db.AutoMigrate(&User{})
✅ 会自动创建表,如果表存在则进行字段比对与升级(非破坏性)。
user := User{Name: "Alice", Email: "[email protected]", Age: 25}
db.Create(&user)
fmt.Println("新ID:", user.ID)
var user User
db.First(&user, 1) // 主键查询
db.First(&user, "email = ?", "[email protected]") // 条件查询
First
:查询一条Find
:查询多条Where
支持链式调用:var users []User
db.Where("age > ?", 20).Order("age desc").Limit(10).Find(&users)
db.Model(&user).Update("Name", "Alice Updated")
db.Model(&user).Updates(User{Name: "NewName", Age: 28}) // 多字段
db.Delete(&user)
GORM 支持各种链式条件语句:
db.Where("name LIKE ?", "%alice%").Find(&users)
db.Where("age BETWEEN ? AND ?", 20, 30).Find(&users)
db.Not("name = ?", "Bob").Find(&users)
你可以定义方法拦截模型的创建、更新、删除行为:
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
u.Name = "【新建】" + u.Name
return
}
err := db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(&User{Name: "TxUser"}).Error; err != nil {
return err
}
if err := tx.Delete(&User{}, 1).Error; err != nil {
return err
}
return nil
})
GORM 支持 SQL 日志:
import "gorm.io/gorm/logger"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
配置 | 说明 |
Create , First , Find , Delete , Update |
基础 CRUD |
Where , Order , Limit , Offset |
链式构造条件 |
AutoMigrate |
自动建表/更新表结构 |
Model(&Model{}) |
设置操作对象 |
功能 | 示例 |
创建表 | db.AutoMigrate(&User{}) |
插入 | db.Create(&user) |
查询 | db.First , db.Where().Find |
更新 | db.Model().Updates() |
删除 | db.Delete(&user) |
事务 | db.Transaction(func) |