ZBLOG

gorm.io/driver/mysql

在 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.注意事项

  1. 索引优化: MySQL建议对高频查询字段添加索引:
     
    type User struct {
       Email string `gorm:"uniqueIndex;size:100"` // VARCHAR(100)
    }
    
  2. 批量插入: MySQL默认单条插入效率低,推荐批处理:
     
    db.CreateInBatches(users, batchSize)
    
  3. 字符集问题: UTF-8乱码时检查DSN是否包含charset=utf8mb4

如果需要调用存储过程或执行复杂SQL,可直接用原生语句:

db.Raw("CALL sp_get_user_by_age(?)", age).Scan(&results)

遇到具体问题时可以提供更多细节!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23941

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?