安装与配置

GORM v2 使用 Go Modules 管理依赖,安装过程很简单。但数据库驱动需要单独安装,这点和 v1 不一样。

安装 GORM

在项目目录下执行:

go get -u gorm.io/gorm

这会安装 GORM v2 最新版本。go.mod 文件会自动添加依赖:

require gorm.io/gorm v1.25.0

安装数据库驱动

GORM v2 把数据库驱动独立出来了,需要根据你的数据库类型单独安装:

MySQL

go get -u gorm.io/driver/mysql

PostgreSQL

go get -u gorm.io/driver/postgres

SQLite

go get -u gorm.io/driver/sqlite

SQL Server

go get -u gorm.io/driver/sqlserver

TiDB(兼容 MySQL 协议)

go get -u gorm.io/driver/tidb

基本配置

安装完成后,创建一个最小可用的示例:

package main

import (
    "fmt"
    "log"
    
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type User struct {
    ID   uint
    Name string
    Age  int
}

func main() {
    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 {
        log.Fatal("连接数据库失败:", err)
    }
    
    fmt.Println("连接成功")
    
    // 自动迁移
    db.AutoMigrate(&User{})
}

GORM 配置选项

gorm.Config 提供了一些配置项:

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    SkipDefaultTransaction: true,  // 跳过默认事务
    PrepareStmt:            true,  // 预编译 SQL
    DisableNestedTransaction: true, // 禁用嵌套事务
    AllowGlobalUpdate:      true,  // 允许全局更新
})

常用配置说明

SkipDefaultTransaction

默认情况下,GORM 会把每个写操作包在事务里。如果你确定不需要,可以关闭提升性能:

&gorm.Config{
    SkipDefaultTransaction: true,
}

PrepareStmt

预编译 SQL 语句,对重复执行的查询有性能提升:

&gorm.Config{
    PrepareStmt: true,
}

Logger

自定义日志输出:

import "gorm.io/gorm/logger"

&gorm.Config{
    Logger: logger.Default.LogMode(logger.Info),
}

日志配置

GORM 内置了日志功能,可以显示执行的 SQL:

import (
    "gorm.io/gorm/logger"
    "log"
    "os"
)

newLogger := logger.New(
    log.New(os.Stdout, "\r\n", log.LstdFlags),
    logger.Config{
        SlowThreshold: time.Second,   // 慢查询阈值
        LogLevel:      logger.Info,   // 日志级别
        Colorful:      true,          // 彩色输出
    },
)

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: newLogger,
})

日志级别:

  • logger.Silent - 不输出
  • logger.Error - 只输出错误
  • logger.Warn - 警告和错误
  • logger.Info - 所有 SQL

生产环境建议设置为 logger.Warnlogger.Error

连接已有的 database/sql 连接

如果你已经有 *sql.DB 对象,可以复用:

import (
    "database/sql"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

sqlDB, err := sql.Open("mysql", dsn)
if err != nil {
    panic(err)
}

// 复用 sql.DB
db, err := gorm.Open(mysql.New(mysql.Config{
    Conn: sqlDB,
}), &gorm.Config{})

验证安装

写个简单的测试确认安装成功:

package main

import (
    "fmt"
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

func main() {
    // 使用 SQLite 内存数据库测试
    db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
    if err != nil {
        panic("连接失败")
    }
    
    // 获取底层的 sql.DB
    sqlDB, _ := db.DB()
    
    // 测试连接
    err = sqlDB.Ping()
    if err != nil {
        panic("Ping 失败")
    }
    
    fmt.Println("GORM 安装成功!")
}

小结

GORM 安装很简单,关键是记住:

  • 安装 gorm.io/gorm 核心库
  • 根据数据库类型安装对应驱动
  • 使用 gorm.Config 进行配置
  • 生产环境注意调整日志级别