教程 > gorm 教程 > 阅读:297

gorm 连接到数据库——迹忆客-ag捕鱼王app官网

gorm 官方支持的数据库类型有: mysql, postgresql, sqlite, sql server

mysql

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{})

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 作为 postgresdatabase/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 教程 获取详情)


sql server

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{})

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{})
  // 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 的方言,在这种情况下,你可以直接使用这些数据库的方言。

对于其它不支持的数据,我们鼓励且欢迎大家伙开发更多数据库类型的驱动!

查看笔记

扫码一下
查看教程更方便
网站地图