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())

连接池配置

为了获得最佳性能,配置数据库连接池:

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论