扫码一下
查看教程更方便
gorm 官方支持的数据库类型有: mysql, postgresql, sqlite, sql server
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
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", // dsn data source name
defaultstringsize: 256, // string 类型字段的默认长度
disabledatetimeprecision: true, // 禁用 datetime 精度,mysql 5.6 之前的数据库不支持
dontsupportrenameindex: true, // 重命名索引时采用删除并新建的方式,mysql 5.7 之前的数据库和 mariadb 不支持重命名索引
dontsupportrenamecolumn: true, // 用 `change` 重命名列,mysql 8 之前的数据库和 mariadb 不支持重命名列
skipinitializewithversion: false, // 根据当前 mysql 版本自动配置
}), &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", // data source name, 详情参考:https://github.com/go-sql-driver/mysql#dsn-data-source-name
}), &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{})
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
缓存,你可以这样禁用它:
// https://github.com/go-gorm/postgres
db, err := gorm.open(postgres.new(postgres.config{
dsn: "user=gorm password=gorm dbname=gorm port=9920 sslmode=disable timezone=asia/shanghai",
prefersimpleprotocol: true, // disables implicit prepared statement usage
}), &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" // 基于 ggo 的 sqlite 驱动
// "github.com/glebarez/sqlite" // 纯 go 实现的 sqlite 驱动, 详情参考: https://github.com/glebarez/sqlite
"gorm.io/gorm"
)
// github.com/mattn/go-sqlite3
db, err := gorm.open(sqlite.open("gorm.db"), &gorm.config{})
**
注意
**: 我们也可以使用file::memory:?cache=shared
替代文件路径。 这会告诉 sqlite 在系统内存中使用一个临时数据库。 (查看 sqlite 教程 获取详情)
import (
"gorm.io/driver/sqlserver"
"gorm.io/gorm"
)
// github.com/denisenkom/go-mssqldb
dsn := "sqlserver://gorm:loremipsum86@localhost:9930?database=gorm"
db, err := gorm.open(sqlserver.open(dsn), &gorm.config{})
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{})
// auto migrate
db.automigrate(&user{})
// set table options
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()
// setmaxidleconns 设置空闲连接池中连接的最大数量
sqldb.setmaxidleconns(10)
// setmaxopenconns 设置打开数据库连接的最大数量。
sqldb.setmaxopenconns(100)
// setconnmaxlifetime 设置了连接可复用的最大时间。
sqldb.setconnmaxlifetime(time.hour)
查看 获取详情。
有些数据库可能兼容 mysql、postgres 的方言,在这种情况下,你可以直接使用这些数据库的方言。
对于其它不支持的数据,我们鼓励且欢迎大家伙开发更多数据库类型的驱动!