在 GORM 中使用 MySQL 数据库时,需要通过 gorm.io/driver/mysql
驱动进行连接。以下是详细的使用指南和示例代码:
1. 安装驱动
go get gorm.io/driver/mysql
go get gorm.io/gorm
2. 连接数据库
基本连接格式
MySQL 的 DSN(数据源名称)格式如下:
username:password@protocol(address)/dbname?param=value
示例代码:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// DSN 格式: username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
dsn := "user:pass@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 to MySQL")
}
}
关键参数说明:
charset=utf8mb4
: 支持完整的 Unicode(包括表情符号)。parseTime=True
: 解析时间字段为time.Time
。loc=Local
: 设置时区为本地。
3. GORM 配置选项
(1) 自定义配置
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
SkipDefaultTransaction: true, // 禁用默认事务
Logger: logger.Default.LogMode(logger.Info), // 启用日志
})
(2) 连接池配置
通过底层 *sql.DB
调整连接池:
sqlDB, _ := db.DB()
sqlDB.SetMaxOpenConns(100) // 最大连接数
sqlDB.SetMaxIdleConns(10) // 空闲连接数
sqlDB.SetConnMaxLifetime(time.Hour) // 连接生命周期
4. CRUD 操作示例
(1) 定义模型
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:50;not null"`
Email string `gorm:"uniqueIndex"`
Age int `gorm:"default:18"`
}
(2) AutoMigrate (自动迁移表)
db.AutoMigrate(&User{})
// Note: MySQL会自动将字段名转为小写蛇形(如 `ID` → `id`)
(3) Insert (插入数据)
user := User{Name: "Alice", Email: "alice@example.com"}
result := db.Create(&user)
if result.Error != nil {
panic(result.Error)
}
fmt.Println("Inserted ID:", user.ID)
(4) Query (查询数据)
var user User
db.First(&user, "email = ?", "alice@example.com") // WHERE email = 'alice@example.com'
// OR条件查询
db.Where("name LIKE ? OR age > ?", "%ali%", 20).Find(&users)
5. MySQL特有功能支持
(1) JSON类型字段
使用 GORM的 datatypes.JSON
:
import "gorm.io/datatypes"
type Product struct {
Attributes datatypes.JSON
}
// JSON操作示例:
product := Product{Attributes: datatypes.JSON(`{"color": "red"}`)}
db.Create(&product)
// JSON查询:
db.Where("attributes->'$.color' = ?", "red").Find(&products)
(2) ON DUPLICATE KEY UPDATE (冲突更新)
批量插入并更新重复记录:
db.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "email"}}, // Conflict key
DoUpdates: clause.AssignmentColumns([]string{"name"}), // Update fields
}).Create(&users)
6.注意事项
- 索引优化: MySQL建议对高频查询字段添加索引:
type User struct { Email string `gorm:"uniqueIndex;size:100"` // VARCHAR(100) }
- 批量插入: MySQL默认单条插入效率低,推荐批处理:
db.CreateInBatches(users, batchSize)
- 字符集问题: UTF-8乱码时检查DSN是否包含
charset=utf8mb4
。
如果需要调用存储过程或执行复杂SQL,可直接用原生语句:
db.Raw("CALL sp_get_user_by_age(?)", age).Scan(&results)
遇到具体问题时可以提供更多细节!
内容由零声教学AI助手提供,问题来源于学员提问