Подключение к базе данных

GORM официально поддерживает базы данных MySQL, PostgreSQL, SQlite, SQL Server и TiDB

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", // имя источника данных
DefaultStringSize: 256, // размер значения по умолчанию для строковых полей
DisableDatetimePrecision: true, // отключить точность полей типа datetime, которая не поддерживается до версии MySQL 5.6
DontSupportRenameIndex: true, // drop & create при переименовании индекса, переименование индекса не поддерживается с версии MySQL 5.7, MariaDB
DontSupportRenameColumn: true, // `change` при переименовании столбца переименование столбца не поддерживалось до MySQL 8, MariaDB
SkipInitializeWithVersion: false, // авто найтройка в зависимости от текущей весрии MySQL
}), &gorm.Config{})

Настройка драйвера

GORM позволяет настроить драйвер MySQL с помощью параметра DriverName, например:

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", // имя источника данных, см. 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 в качестве драйвера sql базы данных postgres, он включает кэш подготовленных выражений по умолчанию, чтобы отключить его:

// 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, // отключает неявное использование подготовленного оператора
}), &gorm.Config{})

Настройка драйвера

GORM позволяет настроить драйвер PostgreSQL с помощью параметра DriverName, например:

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" // Sqlite драйвер основанный на CGO
// "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{})

TiDB

TiDB совместим с MySQL протоколом. Вы можете использовать часть MySQL, чтобы создать подключение к TiDB.

Есть несколько моментов, заслуживающих внимания при работе с TiDB:

  • Вы можете использовать gorm:"primaryKey;default:auto_random()" тег для использования AUTO_RANDOM в TiDB.
  • TiDB поддерживает SAVEPOINT от v6.2.0, пожалуйста, обратите внимание на версию TiDB при использовании этой функции.
  • TiDB поддерживает FOREIGN KEY от v 6.6.0, пожалуйста, обратите внимание на версию 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") // find product with 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()

// SetMaxIdleConns устанавливает максимальное количество подключений в пуле незанятых подключений.
sqlDB.SetMaxIdleConns(10)

// SetMaxOpenConns устанавливает максимальное количество открытых подключений к базе данных.
sqlDB.SetMaxOpenConns(100)

// SetConnMaxLifetime устанавливает максимальное время, в течение которого соединение может использоваться повторно.
sqlDB.SetConnMaxLifetime(time.Hour)

Смотрите раздел Общий интерфейс для получения подробной информации

Неподдерживаемые базы данных

Некоторые базы данных могут быть совместимы с диалектом mysql или postgres, и в этом случае вы могли бы просто использовать диалект для этих баз данных.

Для других баз данных, вам предлагается создать драйвер, pull request приветствуется!

Platinum Sponsors

Platinum Sponsors