驱动程序和方言
要连接到数据库,您需要一个 database/sql
驱动程序和一个与 Bun 捆绑在一起的相应 SQL 方言。
PostgreSQL
有关使用 Bun 与 PostgreSQL 的信息,请参阅 PostgreSQL 部分。
MySQL
Bun 支持使用 MySQL 驱动程序 和 mysqldialect
的 MySQL 5+ 和 MariaDB。
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 从 v1.1.x 版本开始支持 SQL Server v2019.CU4。要连接到 SQL Server,请使用 go-mssqldb 驱动程序和 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
要连接到 SQLite 数据库,请使用 sqliteshim 驱动程序,该驱动程序会自动导入 modernc.org/sqlite 或 mattn/go-sqlite3,具体取决于您的平台。
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())
如果您使用的是内存数据库,则需要将 *sql.DB
配置为不关闭活动连接。否则,连接关闭时数据库将被删除。
sqldb.SetMaxIdleConns(1000)
sqldb.SetConnMaxLifetime(0)
编写特定于 DMBS 的代码
Bun 带有 feature 包,允许您发现 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)
}
您也可以直接检查数据库方言名称。
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")
}