Bun ORM 全面指南:Go 语言高性能数据库操作利器
(本文内容基于 Bun ORM 官方文档 翻译整理)
1. 简介:什么是 Bun ORM?
Bun 是一个 SQL 优先的 Go 语言 ORM(对象关系映射)框架,支持 PostgreSQL、MySQL、MSSQL 和 SQLite。它旨在提供一种简单高效的方式来操作数据库,同时利用 Go 的类型安全特性并减少样板代码。
核心特性
- 基于标准库构建:构建在 Go 标准
database/sql包之上 - 类型安全:提供类型安全的查询构建器,性能卓越
- 复杂关系支持:支持复杂的关系和连接操作
- 迁移支持:提供迁移和架构管理功能
- 强大的扫描能力:全面的数据扫描功能
- 钩子和中间件:支持钩子和中间件
- 生产就绪:经过广泛测试,可用于生产环境
为什么选择 Bun?
Bun 通过 SQL 优先 的理念区别于其他 Go ORM,不试图对开发者隐藏 SQL。这种方法具有以下优势:
- 可预测的查询:你确切知道生成的 SQL 是什么
- 高性能:对原始 SQL 的开销最小
- 渐进式采用:易于集成到现有代码库
- 灵活性:需要时可降级到原始 SQL
- 类型安全:大多数操作的编译时检查
2. 安装与配置
安装 Bun
要安装 Bun 和所需的数据库驱动:
# 核心 Bun 包
go get github.com/uptrace/bun@latest
# 数据库驱动(选择一个或多个)
go get github.com/uptrace/bun/driver/pgdriver # PostgreSQL
go get github.com/uptrace/bun/driver/sqliteshim # SQLite
go get github.com/go-sql-driver/mysql # MySQL
go get github.com/denisenkom/go-mssqldb # SQL Server
快速开始示例
package main
import (
"context"
"database/sql"
"fmt"
"log"
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/sqlitedialect"
"github.com/uptrace/bun/driver/sqliteshim"
"github.com/uptrace/bun/extra/bundebug"
)
// User 模型
type User struct {
bun.BaseModel `bun:"table:users,alias:u"`
ID int64 `bun:",pk,autoincrement"`
Name string `bun:",notnull"`
Email string `bun:",unique"`
}
func main() {
ctx := context.Background()
// 打开数据库连接
sqldb, err := sql.Open(sqliteshim.ShimName, "file::memory:?cache=shared")
if err != nil {
panic(err)
}
defer sqldb.Close()
// 创建 Bun 数据库实例
db := bun.NewDB(sqldb, sqlitedialect.New())
// 添加查询调试(可选)
db.AddQueryHook(bundebug.NewQueryHook(
bundebug.WithVerbose(true),
))
// 创建表
_, err = db.NewCreateTable().Model((*User)(nil)).IfNotExists().Exec(ctx)
if err != nil {
panic(err)
}
// 插入用户
user := &User{Name: "张三", Email: "zhangsan@example.com"}
_, err = db.NewInsert().Model(user).Exec(ctx)
if err != nil {
panic(err)
}
// 查询用户
var selectedUser User
err = db.NewSelect().Model(&selectedUser).Where("email = ?", "zhangsan@example.com").Scan(ctx)
if err != nil {
panic(err)
}
fmt.Printf("用户: %+v\n", selectedUser)
}
3. 数据库连接配置
PostgreSQL 连接
import (
"database/sql"
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/pgdialect"
"github.com/uptrace/bun/driver/pgdriver"
)
// 使用 pgdriver(推荐)
sqldb := sql.OpenDB(pgdriver.NewConnector(
pgdriver.WithDSN("postgres://user:password@localhost:5432/dbname?sslmode=disable"),
))
db := bun.NewDB(sqldb, pgdialect.New())
// 或者使用 lib/pq
import _ "github.com/lib/pq"
sqldb, err := sql.Open("postgres", "postgres://user:password@localhost/dbname?sslmode=disable")
if err != nil {
log.Fatal(err)
}
db := bun.NewDB(sqldb, pgdialect.New())
MySQL 连接
import (
"database/sql"
"github.com/uptrace/bun/dialect/mysqldialect"
_ "github.com/go-sql-driver/mysql"
)
sqldb, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname?parseTime=true")
if err != nil {
panic(err)
}
db := bun.NewDB(sqldb, mysqldialect.New())
SQLite 连接
import (
"database/sql"
"github.com/uptrace/bun/dialect/sqlitedialect"
"github.com/uptrace/bun/driver/sqliteshim"
)
sqldb, err := sql.Open(sqliteshim.ShimName, "file:test.db?cache=shared&mode=rwc")
if err != nil {
panic(err)
}
db := bun.NewDB(sqldb, sqlitedialect.New())
连接池配置
为了获得最佳性能,配置数据库连接池:
评论
?
参与讨论