入门指南

连接到数据库

qianmoQqianmoQ· 更新于 2026-09-22· 阅读 22 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

GORM官方支持 MySQL、PostgreSQL、GaussDB、SQLite、SQL Server、TiDB 和 Oracle 数据库。

MySQL

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

func main() {
  
  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{})
}

注意:
要正确处理 time.Time,您需要在参数中包含 parseTime。(更多参数)
要完全支持 UTF-8 编码,您需要将 charset=utf8 改为 charset=utf8mb4。详细解释请参阅此文章。

MySQL 驱动程序提供了一些高级配置,可在初始化时使用,例如:

db, err := gorm.Open(mysql.New(mysql.Config{
  DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", 
  DefaultStringSize: 256, 
  DisableDatetimePrecision: true, 
  DontSupportRenameIndex: true, 
  DontSupportRenameColumn: true, 
  SkipInitializeWithVersion: false, 
}), &gorm.Config{})

自定义驱动程序

GORM 允许通过 DriverName 选项自定义 MySQL 驱动程序,例如:

import (
  _ "example.com/my_mysql_driver"
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

db, err := gorm.Open(mysql.New(mysql.Config{
  DriverName: "my_mysql_driver",
  DSN: "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local", 
}), &gorm.Config{})

现有数据库连接

GORM 允许使用现有的数据库连接初始化 *gorm.DB

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

sqlDB, err := sql.Open("mysql", "mydb_dsn")
gormDB, err := gorm.Open(mysql.New(mysql.Config{
  Conn: sqlDB,
}), &gorm.Config{})

PostgreSQL

import (
  "gorm.io/driver/postgres"
  "gorm.io/gorm"
)

dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})

我们使用 pgx 作为 PostgreSQL 的 database/sql 驱动程序,它默认启用预编译语句缓存,要禁用它:


db, err := gorm.Open(postgres.New(postgres.Config{
  DSN: "user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai",
  PreferSimpleProtocol: true, 
}), &gorm.Config{})

自定义驱动程序

GORM 允许通过 DriverName 选项自定义 PostgreSQL 驱动程序,例如:

import (
  _ "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/postgres"
  "gorm.io/gorm"
)

db, err := gorm.Open(postgres.New(postgres.Config{
  DriverName: "cloudsqlpostgres",
  DSN: "host=project:region:instance user=postgres dbname=postgres password=password sslmode=disable",
})

现有数据库连接

GORM 允许使用现有的数据库连接初始化 *gorm.DB

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

sqlDB, err := sql.Open("pgx", "mydb_dsn")
gormDB, err := gorm.Open(postgres.New(postgres.Config{
  Conn: sqlDB,
}), &gorm.Config{})

GaussDB

import (
  "gorm.io/driver/gaussdb"
  "gorm.io/gorm"
)

dsn := "host=localhost user=gorm password=gorm dbname=gorm port=8000 sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(gaussdb.Open(dsn), &gorm.Config{})

我们使用 gaussdb-go 作为 GaussDB 的 database/sql 驱动程序,它默认启用预编译语句缓存,要禁用它:


db, err := gorm.Open(gaussdb.New(gaussdb.Config{
  DSN: "user=gorm password=gorm dbname=gorm port=8000 sslmode=disable TimeZone=Asia/Shanghai",
  PreferSimpleProtocol: true, 
}), &gorm.Config{})

自定义驱动程序

GORM 允许通过 DriverName 选项自定义 GaussDB 驱动程序,例如:

import (
  _ "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/gaussdb"
  "gorm.io/gorm"
)

db, err := gorm.Open(gaussdb.New(gaussdb.Config{
  DriverName: "cloudsqlgaussdb",
  DSN: "host=project:region:instance user=gaussdb dbname=gaussdb password=password sslmode=disable",
})

现有数据库连接

GORM 允许使用现有的数据库连接初始化 *gorm.DB

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

sqlDB, err := sql.Open("gaussdbgo", "mydb_dsn")
gormDB, err := gorm.Open(gaussdb.New(gaussdb.Config{
  Conn: sqlDB,
}), &gorm.Config{})

Oracle 数据库

GORM 的 Oracle 驱动程序提供了对 Oracle 数据库的支持,能够完全兼容 GORM 的 ORM 功能。它基于 Go Driver for Oracle (Godror) 构建,并支持关键功能,如自动迁移、关联、事务和高级查询。

前提条件:安装 Instant Client

要将 Godror 与 ODPI-C 一起使用,您需要在系统上安装 Oracle Instant Client。请按照此页面上的步骤完成安装。

之后,您可以使用 dataSourceName 连接到数据库,该名称使用 logfmt 编码的参数列表指定连接参数(如用户名和密码)。

指定 Instant Client 目录的方式因平台而异:

  • macOS 和 Windows:您可以在 dataSourceName 中设置 libDir 参数。
  • Linux:在您的 Go 进程启动之前,这些库必须位于系统库搜索路径中,最好通过 “ldconfig” 进行配置。libDir 参数在 Linux 上无效。

示例 (macOS/Windows)

dataSourceName := `user="scott" password="tiger" 
                   connectString="dbhost:1521/orclpdb1"
                   libDir="/Path/to/your/instantclient_23_26"`

示例 (Linux)

dataSourceName := `user="scott" password="tiger" 
                   connectString="dbhost:1521/orclpdb1"`

入门指南

import (
  "github.com/oracle-samples/gorm-oracle/oracle"
  "gorm.io/gorm"
)

dataSourceName := `user="scott" password="tiger"
                   connectString="dbhost:1521/orclpdb1"`
db, err := gorm.Open(oracle.Open(dataSourceName), &gorm.Config{})

SQLite

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


db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})

注意: 您也可以使用 file::memory:?cache=shared 代替文件路径。这将告诉 SQLite 使用系统内存中的临时数据库。(有关此内容,请参阅 SQLite 文档)

SQL Server

import (
  "gorm.io/driver/sqlserver"
  "gorm.io/gorm"
)


dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"
db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})

TiDB

TiDB 兼容 MySQL 协议。您可以按照 MySQL 部分来创建与 TiDB 的连接。

关于 TiDB 有一些需要注意的点:

  • 您可以使用 gorm:"primaryKey;default:auto_random()" 标签来为 TiDB 启用 AUTO_RANDOM 功能。
  • TiDB 从 v6.2.0 开始支持 SAVEPOINT,使用此功能时请注意 TiDB 的版本。
  • TiDB 从 v6.6.0 开始支持 FOREIGN KEY,使用此功能时请注意 TiDB 的版本。
import (
  "fmt"
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

type Product struct {
  ID    uint `gorm:"primaryKey;default:auto_random()"`
  Code  string
  Price uint
}

func main() {
  db, err := gorm.Open(mysql.Open("root:@tcp(127.0.0.1:4000)/test"), &gorm.Config{})
  if err != nil {
    panic("failed to connect database")
  }

  db.AutoMigrate(&Product{})

  insertProduct := &Product{Code: "D42", Price: 100}

  db.Create(insertProduct)
  fmt.Printf("insert ID: %d, Code: %s, Price: %d\n",
    insertProduct.ID, insertProduct.Code, insertProduct.Price)

  readProduct := &Product{}
  db.First(&readProduct, "code = ?", "D42") 

  fmt.Printf("read ID: %d, Code: %s, Price: %d\n",
    readProduct.ID, readProduct.Code, readProduct.Price)
}

Clickhouse

https://github.com/go-gorm/clickhouse

import (
  "gorm.io/driver/clickhouse"
  "gorm.io/gorm"
)

func main() {
  dsn := "tcp://localhost:9000?database=gorm&username=gorm&password=gorm&read_timeout=10&write_timeout=20"
  db, err := gorm.Open(clickhouse.Open(dsn), &gorm.Config{})

  
  db.AutoMigrate(&User{})
  
  db.Set("gorm:table_options", "ENGINE=Distributed(cluster, default, hits)").AutoMigrate(&User{})

  
  db.Create(&user)

  
  db.Find(&user, "id = ?", 10)

  
  var users = []User{user1, user2, user3}
  db.Create(&users)
  
}

连接池

GORM 使用 database/sql 来维护连接池

sqlDB, err := db.DB()


sqlDB.SetMaxIdleConns(10)


sqlDB.SetMaxOpenConns(100)


sqlDB.SetConnMaxLifetime(time.Hour)

详情请参考通用接口

不支持的数据库

某些数据库可能与 mysql 或 postgres 方言兼容,在这种情况下,您可以直接为这些数据库使用该方言。

对于其他数据库,我们鼓励您编写一个驱动程序,欢迎提交 Pull Request!

GitHub tag (latest SemVer)

评论

登录后参与评论

正在加载评论…