GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
MySQL
1. import (
2. "gorm.io/driver/mysql"
3. "gorm.io/gorm"
4. )
6. func main() {
7. // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
8. dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
9. db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
10. }
注意:想要正确的处理
time.Time,您需要带上parseTime参数, (更多参数) 要支持完整的 UTF-8 编码,您需要将charset=utf8更改为charset=utf8mb4查看 此文章 获取详情
MySQl 驱动程序提供了 一些高级配置 可以在初始化过程中使用,例如:
1. db, err := gorm.Open(mysql.New(mysql.Config{
2. DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
3. DefaultStringSize: 256, // string 类型字段的默认长度
4. DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
5. DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
6. DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
7. SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
8. }), &gorm.Config{})
自定义驱动
GORM 允许通过 DriverName 选项自定义 MySQL 驱动,例如:
1. import (
2. _ "example.com/my_mysql_driver"
3. "gorm.io/gorm"
4. )
6. db, err := gorm.Open(mysql.New(mysql.Config{
7. DriverName: "my_mysql_driver",
8. DSN: "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local", // Data Source Name,参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name
9. }), &gorm.Config{})
现有的数据库连接
GORM 允许通过一个现有的数据库连接来初始化 *gorm.DB
1. import (
2. "database/sql"
3. "gorm.io/driver/mysql"
4. "gorm.io/gorm"
5. )
7. sqlDB, err := sql.Open("mysql", "mydb_dsn")
8. gormDB, err := gorm.Open(mysql.New(mysql.Config{
9. Conn: sqlDB,
10. }), &gorm.Config{})
PostgreSQL
1. import (
2. "gorm.io/driver/postgres"
3. "gorm.io/gorm"
4. )
6. dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"
7. db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
我们使用 pgx 作为 postgres 的 database/sql 驱动,默认情况下,它会启用 prepared statement 缓存,你可以这样禁用它:
1. // https://github.com/go-gorm/postgres
2. db, err := gorm.Open(postgres.New(postgres.Config{
3. DSN: "user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai",
4. PreferSimpleProtocol: true, // disables implicit prepared statement usage
5. }), &gorm.Config{})
自定义驱动
GORM 允许通过 DriverName 选项自定义 PostgreSQL 驱动,例如:
1. import (
2. _ "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/postgres"
3. "gorm.io/gorm"
4. )
6. db, err := gorm.Open(postgres.New(postgres.Config{
7. DriverName: "cloudsqlpostgres",
8. DSN: "host=project:region:instance user=postgres dbname=postgres password=password sslmode=disable",
9. })
现有的数据库连接
GORM 允许通过一个现有的数据库连接来初始化 *gorm.DB
1. import (
2. "database/sql"
3. "gorm.io/driver/postgres"
4. "gorm.io/gorm"
5. )
7. sqlDB, err := sql.Open("pgx", "mydb_dsn")
8. gormDB, err := gorm.Open(postgres.New(postgres.Config{
9. Conn: sqlDB,
10. }), &gorm.Config{})
SQLite
1. import (
2. "gorm.io/driver/sqlite" // Sqlite driver based on GGO
3. // "github.com/glebarez/sqlite" // Pure go SQLite driver, checkout https://github.com/glebarez/sqlite for details
4. "gorm.io/gorm"
5. )
7. // github.com/mattn/go-sqlite3
8. db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
注意: 您也可以使用
file::memory:?cache=shared替代文件路径。 这会告诉 SQLite 在系统内存中使用一个临时数据库。 (查看 SQLite 文档 获取详情)
SQL Server
1. import (
2. "gorm.io/driver/sqlserver"
3. "gorm.io/gorm"
4. )
6. // github.com/denisenkom/go-mssqldb
7. dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"
8. db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
Clickhouse
<https://github.com/go-gorm/clickhouse>
1. import (
2. "gorm.io/driver/clickhouse"
3. "gorm.io/gorm"
4. )
6. func main() {
7. dsn := "tcp://localhost:9000?database=gorm&username=gorm&password=gorm&read_timeout=10&write_timeout=20"
8. db, err := gorm.Open(clickhouse.Open(dsn), &gorm.Config{})
10. // Auto Migrate
11. db.AutoMigrate(&User{})
12. // Set table options
13. db.Set("gorm:table_options", "ENGINE=Distributed(cluster, default, hits)").AutoMigrate(&User{})
15. // 插入
16. db.Create(&user)
18. // 查询
19. db.Find(&user, "id = ?", 10)
21. // 批量插入
22. var users = []User{user1, user2, user3}
23. db.Create(&users)
24. // ...
25. }
连接池
GORM 使用 database/sql 维护连接池
1. sqlDB, err := db.DB()
3. // SetMaxIdleConns 设置空闲连接池中连接的最大数量
4. sqlDB.SetMaxIdleConns(10)
6. // SetMaxOpenConns 设置打开数据库连接的最大数量。
7. sqlDB.SetMaxOpenConns(100)
9. // SetConnMaxLifetime 设置了连接可复用的最大时间。
10. sqlDB.SetConnMaxLifetime(time.Hour)
查看 通用接口 获取详情。
不支持的数据库
有些数据库可能兼容 mysql、postgres 的方言,在这种情况下,你可以直接使用这些数据库的方言。
对于其它不支持的数据,我们鼓励且欢迎大家伙开发更多数据库类型的驱动!
