Conectarse a una base de datos

GORM officially supports the databases MySQL, PostgreSQL, GaussDB, SQLite, SQL Server TiDB, and Oracle Database

MySQL

import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

func main() {
// refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details
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{})
}

NOTA: Para manejar time.Time correctamente, necesita incluir parseTime como parámetro. (más parámetros) Para soportar completamente la codificación UTF-8, necesita cambiar charset=utf8 a charset=utf8mb4. Ver este artículo para una explicación detallada

El controlador MySQL proporciona algunas configuraciones avanzadas que pueden ser usadas durante la inicialización, por ejemplo:

db, err := gorm.Open(mysql.New(mysql.Config{
DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // data source name
DefaultStringSize: 256, // default size for string fields
DisableDatetimePrecision: true, // disable datetime precision, which not supported before MySQL 5.6
DontSupportRenameIndex: true, // drop & create when rename index, rename index not supported before MySQL 5.7, MariaDB
DontSupportRenameColumn: true, // `change` when rename column, rename column not supported before MySQL 8, MariaDB
SkipInitializeWithVersion: false, // auto configure based on currently MySQL version
}), &gorm.Config{})

Driver Personalizado

GORM permite personalizar el controlador MySQL con la opción DriverName, por ejemplo:

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, refer https://github.com/go-sql-driver/mysql#dsn-data-source-name
}), &gorm.Config{})

Conexión a la base de datos existente

GORM permite inicializar *gorm.DB con una conexión de base de datos existente

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

Estamos usando pgx como controlador de base de datos/sql de postgres, la caché de declaración se habilita por defecto, para deshabilitarla:

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

Driver Personalizado

GORM permite personalizar el controlador de PostgreSQL con la opción DriverName, por ejemplo:

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",
})

Conexión de base de datos existente

GORM permite inicializar *gorm.DB con una conexión de base de datos existente

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

GaussDB

import (
"gorm.io/driver/gaussdb"
"gorm.io/gorm"
)

dsn := "host=localhost user=gorm password=gorm dbname=gorm port=8000 sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(gaussdb.Open(dsn), &gorm.Config{})

We are using gaussdb-go as gaussdb’s database/sql driver, it enables prepared statement cache by default, to disable it:

// https://github.com/go-gorm/gaussdb
db, err := gorm.Open(gaussdb.New(gaussdb.Config{
DSN: "user=gorm password=gorm dbname=gorm port=8000 sslmode=disable TimeZone=Asia/Shanghai",
PreferSimpleProtocol: true, // disables implicit prepared statement usage
}), &gorm.Config{})

Customize Driver

GORM allows to customize the GaussDB driver with the DriverName option, for example:

import (
_ "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/gaussdb"
"gorm.io/gorm"
)

db, err := gorm.Open(gaussdb.New(gaussdb.Config{
DriverName: "cloudsqlgaussdb",
DSN: "host=project:region:instance user=gaussdb dbname=gaussdb password=password sslmode=disable",
})

Existing database connection

GORM allows to initialize *gorm.DB with an existing database connection

import (
"database/sql"
"gorm.io/driver/gaussdb"
"gorm.io/gorm"
)

sqlDB, err := sql.Open("gaussdbgo", "mydb_dsn")
gormDB, err := gorm.Open(gaussdb.New(gaussdb.Config{
Conn: sqlDB,
}), &gorm.Config{})

Oracle Database

The GORM Driver for Oracle provides support for Oracle Database, enabling full compatibility with GORM’s ORM capabilities. It is built on top of the Go Driver for Oracle (Godror) and supports key features such as auto migrations, associations, transactions, and advanced querying.

Prerequisite: Install Instant Client

To use ODPI-C with Godror, you’ll need to install the Oracle Instant Client on your system. Follow the steps on this page to complete the installation.

After that, you can connect to the database using the dataSourceName, which specifies connection parameters (such as username and password) using a logfmt-encoded parameter list.

The way you specify the Instant Client directory differs by platform:

  • macOS and Windows: You can set the libDir parameter in the dataSourceName.
  • Linux: The libraries must be in the system library search path before your Go process starts, preferably configured with “ldconfig”. The libDir parameter does not work on Linux.

Example (macOS/Windows)

dataSourceName := `user="scott" password="tiger" 
connectString="dbhost:1521/orclpdb1"
libDir="/Path/to/your/instantclient_23_26"`

Example (Linux)

dataSourceName := `user="scott" password="tiger" 
connectString="dbhost:1521/orclpdb1"`

Getting Started

import (
"github.com/oracle-samples/gorm-oracle/oracle"
"gorm.io/gorm"
)

dataSourceName := `user="scott" password="tiger"
connectString="dbhost:1521/orclpdb1"`
db, err := gorm.Open(oracle.Open(dataSourceName), &gorm.Config{})

SQLite

import (
"gorm.io/driver/sqlite" // Sqlite driver based on CGO
// "github.com/glebarez/sqlite" // Pure go SQLite driver, checkout https://github.com/glebarez/sqlite for details
"gorm.io/gorm"
)

// github.com/mattn/go-sqlite3
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})

NOTA: También puedes usar archivo::memory:?cache=shared en lugar de una ruta a un archivo. Esto le dirá a SQLite que utilice una base de datos temporal en la memoria del sistema. (Ver docs SQLite para esto)

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 es compatible con el protocolo MySQL. Puedes seguir la parte de MySQL para crear una conexión a TiDB.

Hay algunos puntos destacables para TiDB:

  • Puedes usar la etiqueta gorm:"primaryKey;default:auto_random()" para usar AUTO_RANDOM función para TiDB.
  • TiDB soportó SAVEPOINT de v6.2.0, por favor tenga en cuenta la versión de TiDB cuando utilice esta función.
  • TiDB soportó FOREIGN KEY de v6.6.0, por favor note la versión de TiDB cuando utilice esta función.
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{})

// Auto Migrate
db.AutoMigrate(&User{})
// Set table options
db.Set("gorm:table_options", "ENGINE=Distributed(cluster, default, hits)").AutoMigrate(&User{})

// Insert
db.Create(&user)

// Select
db.Find(&user, "id = ?", 10)

// Batch Insert
var users = []User{user1, user2, user3}
db.Create(&users)
// ...
}

Pool de Conexión

GORM usando database/sql para mantener el pool de conexiones

sqlDB, err := db.DB()

// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
sqlDB.SetMaxIdleConns(10)

// SetMaxOpenConns sets the maximum number of open connections to the database.
sqlDB.SetMaxOpenConns(100)

// SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
sqlDB.SetConnMaxLifetime(time.Hour)

Consulte Interfaz Genérica para más detalles

Bases de datos no soportadas

Algunas bases de datos pueden ser compatibles con el dialecto de mysql o de postgres , en cuyo caso podría usar el dialect para esas bases de datos.

¡Para otros, se te anima a hacer un driver, pull request son bienvenida!

Platinum Sponsors

Become a Sponsor!

Platinum Sponsors

Become a Sponsor!