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 driveropen in new window 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-mssqldbopen in new window 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 sqliteshimopen in new window driver which automatically imports modernc.org/sqliteopen in new window or mattn/go-sqlite3open in new window 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 featureopen in new window 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")
}