(本文内容基于 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()) 连接池配置 为了获得最佳性能,配置数据库连接池:
...