Go语言数据库编程:GORM 的基本使用

发布时间:2025-06-26 09:33  浏览量:1

GORM是 Go 语言最流行的 ORM 框架,封装了 database/sql,支持自动迁移、关联关系、事务等功能,开发体验接近于高层语言的 ORM。

一、安装与初始化1. 安装 GORM 及数据库驱动go get -u gorm.io/gormgo get -u gorm.io/driver/mysql# PostgreSQL 用户:# go get -u gorm.io/driver/postgres2. 建立数据库连接packagemainimport("gorm.io/driver/mysql""gorm.io/gorm""log")funcmain { 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{})iferr !=nil{ log.Fatal("连接数据库失败:", err) } log.Println("连接成功")}

二、定义模型结构体typeUserstruct{ IDuint`gorm:"primaryKey"`NamestringEmailstring`gorm:"uniqueIndex"`AgeintCreatedAt time.Time}

• 使用 GORM 标签配置字段属性。• 支持自动创建 id、created_at 等字段。

三、自动迁移表结构db.AutoMigrate(&User{})

✅ 会自动创建表,如果表存在则进行字段比对与升级(非破坏性)。

四、基本 CRUD 操作1. 新增数据user := User{Name:"Alice", Email:"alice@example.com", Age:25}db.Create(&user)fmt.Println("新ID:", user.ID)2. 查询数据varuser Userdb.First(&user,1)// 主键查询db.First(&user,"email = ?","alice@example.com")// 条件查询

• First:查询一条• Find:查询多条• Where 支持链式调用:

varusers Userdb.Where("age > ?",20).Order("age desc").Limit(10).Find(&users)3. 更新数据db.Model(&user).Update("Name","Alice Updated")db.Model(&user).Updates(User{Name:"NewName", Age:28})// 多字段4. 删除数据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)

六、钩子函数(Hooks)

你可以定义方法拦截模型的创建、更新、删除行为:

func(u *User) BeforeCreate(tx *gorm.DB) (errerror) { u.Name ="【新建】"+ u.Namereturn}

七、事务处理err := db.Transaction(func(tx *gorm.DB)error{iferr := tx.Create(&User{Name:"TxUser"}).Error; err !=nil{returnerr }iferr := tx.Delete(&User{},1).Error; err !=nil{returnerr }returnnil})

八、日志与调试

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基础 CRUDWhere, 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)