Drivers and dialects
To connect to a database, you need a database/sql
driver and a corrensponding SQL dialect that comes with bun.
PostgreSQL
See PostgreSQL section for information about using Bun with PostgreSQL.
MySQL
Bun supports MySQL 5+ and MariaDB using MySQL driver and mysqldialect
:
import (
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/mysqldialect"
_ "github.com/go-sql-driver/mysql"
)
sqldb, err := sql.Open("mysql", "root:pass@/test")
if err != nil {
panic(err)
}
db := bun.NewDB(sqldb, mysqldialect.New())
MSSQL
Bun supports SQL Server v2019.CU4 starting from v1.1.x. To connect to a SQL Server, use go-mssqldb driver and mssqldialect
:
import (
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/mssqldialect"
_ "github.com/denisenkom/go-mssqldb"
)
sqldb, err := sql.Open("sqlserver", "sqlserver://sa:passWORD1@localhost:1433?database=test")
if err != nil {
panic(err)
}
db := bun.NewDB(sqldb, mssqldialect.New())
SQLite
To connect to a SQLite database, use sqliteshim driver which automatically imports modernc.org/sqlite or mattn/go-sqlite3 depending on your platform.
import (
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/sqlitedialect"
"github.com/uptrace/bun/driver/sqliteshim"
)
sqldb, err := sql.Open(sqliteshim.ShimName, "file::memory:?cache=shared")
if err != nil {
panic(err)
}
db := bun.NewDB(sqldb, sqlitedialect.New())
If you are using an in-memory database, you need to configure *sql.DB
to NOT close active connections. Otherwise, the database is deleted when the connection is closed.
sqldb.SetMaxIdleConns(1000)
sqldb.SetConnMaxLifetime(0)
Writing DMBS specific code
Bun comes with feature package that allows you to discover features supported by your DBMS:
import "github.com/uptrace/bun/dialect/feature"
if db.HasFeature(feature.InsertOnConflict) {
// DBMS supports `ON CONFLICT DO UPDATE` (PostgreSQL, SQLite)
}
if db.HasFeature(feature.InsertOnDuplicateKey) {
// DBMS supports `ON DUPLICATE KEY UPDATE` (MySQL, MariaDB)
}
You can also directly check the database dialect name:
import "github.com/uptrace/bun/dialect"
switch db.Dialect().Name() {
case dialect.SQLite:
case dialect.PG:
case dialect.MySQL:
case dialect.MSSQL:
default:
panic("not reached")
}