Golang GORM 使用指南
GORM 是 Go 语言中最流行的 ORM(Object-Relational Mapping)框架之一,支持 MySQL、PostgreSQL、SQLite 等多种数据库。以下是 GORM 的详细使用指南。
1. 安装与初始化
安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql # MySQL驱动
基本连接配置
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// MySQL DSN格式: [username[:password]@][protocol[(address)]]/dbname[?param1=value1&...]
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")
}
// 获取通用数据库对象 sql.DB,然后使用其方法
sqlDB, _ := db.DB()
defer sqlDB.Close()
}
2. 模型定义
GORM 使用结构体作为模型基础:
type User struct {
gorm.Model // 内嵌包含ID, CreatedAt, UpdatedAt, DeletedAt字段
Name string `gorm:"size:255"`
Age int `gorm:"default:18"`
Email string `gorm:"uniqueIndex;not null"`
}
type Product struct {
Code string `gorm:"primaryKey"`
Price uint
}
常用标签:
primaryKey:主键字段column:指定列名size:定义大小/长度not null:非空约束uniqueIndex:唯一索引default:默认值
3. CRUD操作
Create (创建)
// 创建单条记录
user := User{Name: "Jinzhu", Age: 18, Email: "jinzhu@example.com"}
result := db.Create(&user) // pass pointer of data to Create
// user.ID // returns inserted data's primary key value(s)
// result.Error // returns error if any occurred during creation
// result.RowsAffected // returns count of records affected
//批量插入
users := []User{
{Name: "Alice", Email: "alice@example.com"},
{Name: "Bob", Email: "bob@example.com"},
}
db.Create(&users)
Query (查询)
//获取第一条记录(主键升序)
var user User
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1 ;
//获取一条记录(无排序)
db.Take(&user)
//获取最后一条记录(主键降序)
db.Last(&user)
//条件查询
db.Where("name = ?","jinzhu").First(&user )
//IN条件查询
db.Where("name IN ?",[]string{"jinzhu","alice"}).Find(&users )
//链式调用示例
tx:= db.Where("age > ?",20 ).Where("email LIKE ?","%@example.com") .Order("created_at desc").Limit(10 ).Find(&users )
Update (更新)
//更新单个列(如果model有UpdatedAt字段会自动更新)
db.Model(&User{}).Where("id =?",1 ).Update("name","hello")
//更新多个列
db.Model(&user ).Updates(User{Name:"hello",Age :18 })
//只更新选定的字段
db.Model(&user ).Select("Name").Updates(map[string]interface{}{"Name":"hello","Age":20 })
Delete (删除)
//软删除(如果模型有DeletedAt字段)
db.Delete(&User{},10 )
////硬删除(永久删除)
db.Unscoped().Delete(&User{},10 )
4 .高级特性
###关联关系
####一对多关系
type Blog struct {
gorm .Model
Name string
Posts []Post //一对多关系
}
type Post struct {
gorm .Model
Title string
Content string
BlogID uint //外键
}
////自动迁移时会自动创建外键约束
func initTables(db *grom.DB){
err:= db.AutoMigrate (&Blog{},&Post{})
if err!=nil { panic(err)}
}
////关联操作示例
func createBlogWithPosts(db *grom.DB){
blog:= Blog{
Name :"GORM Tutorials ",
Posts :[]Post{{Title:"First Post"},},}
result:= db.Create (&blog )
fmt.Println(result.Error )
fmt.Println(blog.Posts[0].BlogID)//自动设置外键值
}
####预加载(Eager Loading)
var blog Blog
////预加载关联的Posts
if err:= db.Preload ("Posts").First (&blog ,1 ).Error ;err!=nil {
panic(err ) }
fmt.Println(len(blog.Posts ))
for _,post:= range blog.Posts {
fmt.Println(post.Title ) }
////带条件的预加载
if err:= db.Preload ("Posts ","title LIKE ?","%first%" ).First (&blog ,1 ).Error ;err!=nil {
panic(err ) }
##5 .事务处理
GORM提供了两种事务处理方式:
###手动事务
tx:= db.Begin ()
if err:= tx.Create (&User{Name :"TxUser"}).Error ;err!=nil {
tx.Rollback () return }
if err:= tx.Model (&User{}).Where ("id =?",100 ).Update ("age ",30 ).Error ;err!=nil {
tx.Rollback () return }
tx.Commit ()
###自动事务
通过Transaction方法自动提交或回滚:
if err:= db.Transaction(func(tx *grom.DB)error{
if err:= tx.Create (&Product{Code:"D42",Price :100 }).Error ;err!=nil {
return err }
if err:= tx.Create (&Product{Code:"D43",Price :200 }).Error ;err!=nil {
return err }
return nil }) ;err!=nil {//返回任何错误都会回滚事务
log.Fatal(err)}
如果需要更详细的教程,可以参考零声教育的相关课程内容。
内容由零声教学AI助手提供,问题来源于学员提问




