GORM officially supports the databases MySQL, PostgreSQL, GaussDB, SQLite, SQL Server, and TiDB
MySQL import ( "gorm.io/driver/mysql" "gorm.io/gorm" ) func main () { 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 , DontSupportRenameIndex: true , DontSupportRenameColumn: true , SkipInitializeWithVersion: false , }), &gorm.Config{})
Customize Driver GORM은 드라이버 이름
옵션을 통해 MySQL 드라이버를 Customize하는 것을 지원합니다. 예시:
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" , }), &gorm.Config{})
Existing database connection GORM은 *gorm.DB
을 생성시 이미 존재하는 데이터베이스 connection을 바탕으로 생성이 가능합니다.
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{})
We are using pgx as postgres’s database/sql driver, it enables prepared statement cache by default, to disable it:
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{})
Customize Driver 드라이버 이름
옵션을 통해 PostgreSQL 드라이버를 Customize하는 것을 지원합니다. 예시:
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" , })
Existing database connection GORM은 *gorm.DB
를 생성시 이미 존재하는 데이터베이스 connection을 바탕으로 생성이 가능합니다.
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:
db, err := gorm.Open(gaussdb.New(gaussdb.Config{ DSN: "user=gorm password=gorm dbname=gorm port=8000 sslmode=disable TimeZone=Asia/Shanghai" , PreferSimpleProtocol: true , }), &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{})
SQLite import ( "gorm.io/driver/sqlite" "gorm.io/gorm" ) db, err := gorm.Open(sqlite.Open("gorm.db" ), &gorm.Config{})
NOTE: You can also use file::memory:?cache=shared
instead of a path to a file. 이 경우 SQLite는 시스템의 메모리에 있는 임시적인 DataBase를 활용할 것 입니다. (SQLite docs 를 참고하세요)
SQL Server import ( "gorm.io/driver/sqlserver" "gorm.io/gorm" ) 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()"
태그를 통해 TiDB의 AUTO_RANDOM
기능을 사용할 수 있습니다.
TiDB는 v6.2.0
버전부터 SAVEPOINT
기능을 지원합니다, 사용하시는 TiDB 버전을 참고하시어 해당 기능을 사용해 주세요.
TiDB는 v6.6.0
버전부터 FOREIGN KEY
기능을 지원합니다, 사용하시는 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" ) 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() sqlDB.SetMaxIdleConns(10 ) sqlDB.SetMaxOpenConns(100 ) sqlDB.SetConnMaxLifetime(time.Hour)
Generic Interface 를 참조하여 더욱 자세한 사항을 알아보세요.
지원되지 않는 데이터베이스 특정 데이터베이스는 mysql
이나 postgres
의 Sql문법과 호환될 수 있습니다. 어떤 경우라도, 해당 데이터 베이스 문법을 활용하여 Gorm을 사용할 수 있습니다.
데이터베이스 드라이버를 만드셨거나, 혹은 다른 이유라도 pull request는 환영입니다!