在 Go 生态中,传统的 ORM 往往要么“魔法”过多(如 GORM),要么过于模板化(如 SQLBoiler)。bun 则以 SQL-first 的设计理念,为开发者提供了轻量、高性能且灵活可控的 ORM 和查询构建器。它同时支持 PostgreSQL、MySQL(包括MariaDB)、SQLite、MSSQL、Oracle,并与分布式追踪平台 Uptrace 深度集成,让你在享受 ORM 便捷性的同时,依然对底层 SQL 保有完全掌控权。
type User struct {
bun.BaseModel `bun:"table:users"`
ID int64 `bun:",pk,autoincrement"`
Name string
Email string
}db.NewSelect().Model(&users) 一行代码即可完成查询。 err := db.NewSelect().
ColumnExpr("u.id, u.name").
TableExpr("users AS u").
Where("u.age > ?", 18).
Join("LEFT JOIN profiles p ON p.user_id = u.id").
Scan(ctx, &results)has one、has many、belongs to、many to many: type Author struct {
ID int64
Name string
Books []Book `bun:"rel:has-many"`
}
type Book struct {
ID int64
Title string
AuthorID int64
}
// 加载作者和其所有书籍
var author Author
db.NewSelect().
Model(&author).
Relation("Books").
Where("author.id = ?", 1).
Scan(ctx) func (u *User) BeforeCreate(ctx context.Context) error {
u.CreatedAt = time.Now()
return nil
} migrator := migrate.NewMigrator(db, migrations.Migrations)
migrator.Init(ctx)
migrator.Migrate(ctx)go get github.com/uptrace/bun
go get github.com/uptrace/bun/driver/pgdriver # PostgreSQL 驱动import (
"context"
"database/sql"
"github.com/uptrace/bun"
"github.com/uptrace/bun/driver/pgdriver"
"github.com/uptrace/bun/dialect/pgdialect"
)
func NewDB() *bun.DB {
dsn := "postgres://user:pass@localhost:5432/mydb?sslmode=disable"
sqldb := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(dsn)))
return bun.NewDB(sqldb, pgdialect.New())
}
func main() {
ctx := context.Background()
db := NewDB()
// 创建记录
user := &User{Name: "Alice", Email: "alice@example.com"}
_, _ = db.NewInsert().Model(user).Exec(ctx)
// 查询记录
var users []User
_ = db.NewSelect().
Model(&users).
Where("age > ?", 21).
Order("name ASC").
Scan(ctx)
}bun.SafeQuery,避免手写拼接字符串。 SetMaxOpenConns, SetMaxIdleConns, SetConnMaxLifetime,避免连接泄漏。特性 | Bun (SQL-first) | GORM (Active Record) |
|---|---|---|
SQL 可控性 | 极高 | 较弱 |
性能 | 接近原生 SQL | 反射+DSL 带来开销 |
关系映射 | 完善 | 完善 |
链式构建器 | 安全、灵活 | 基础 |
文档与社区 | 发展迅速 | 成熟、大量资源 |
分布式追踪集成 | 原生支持 Uptrace | 需第三方适配 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。