GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
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 作为 postgres 的 database/sql 驱动,默认情况下,它会启用 prepared statement 缓存,你可以这样禁用它:
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{})
|
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{})
|
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
的方言,在这种情况下,你可以直接使用这些数据库的方言。
对于其它不支持的数据,我们鼓励且欢迎大家伙开发更多数据库类型的驱动!