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

2026-02-02 · 9 分钟 · czyt

Calude Code编写的Ent ORM 完整指南

本文由claude code生成。作为备忘录和分享,欢迎指正和补充。 一、Ent简介 Ent是一个简单但功能强大的实体框架,用于Go语言,使构建和维护具有大型数据模型的应用程序变得容易。 Ent是由Meta(Facebook)开源团队构建的ORM框架,提供了一个API,用于将任何数据库模式建模为Go对象。 核心特性 Ent的主要特性包括: Schema As Code:将任何数据库模式建模为Go对象 轻松遍历任何图结构:运行查询、聚合并轻松遍历任何图结构 静态类型和显式API:100%静态类型和显式API,通过代码生成实现 多存储驱动支持:支持MySQL、PostgreSQL、SQLite和Gremlin 易于扩展:使用Go模板简单扩展和自定义 Ent是一个相当新的ORM,使用代码优先的方法,在Go代码中定义模式。Ent之所以流行,是因为它能够优雅地处理复杂的数据模型和关系。 二、快速开始 2.1 安装Ent # 初始化Go模块 go mod init myapp # 安装ent CLI工具 go install entgo.io/ent/cmd/ent@latest # 或者使用go get go get entgo.io/ent/cmd/ent 2.2 创建第一个Schema # 创建User实体 ent new User 这会在 ent/schema/ 目录下生成一个基础的schema文件: package schema import ( "entgo.io/ent" "entgo.io/ent/schema/field" ) // User holds the schema definition for the User entity. type User struct { ent.Schema } // Fields of the User. func (User) Fields() []ent.Field { return []ent.Field{ field.String("name"). NotEmpty(), field.Int("age"). Positive(), field.String("email"). Unique(), field.Time("created_at"). Default(time.Now), } } // Edges of the User. func (User) Edges() []ent.Edge { return nil } 2.3 生成代码 go generate ./ent 2.4 连接数据库并使用 package main import ( "context" "log" "myapp/ent" _ "github.com/lib/pq" // PostgreSQL // _ "github.com/go-sql-driver/mysql" // MySQL // _ "github.com/mattn/go-sqlite3" // SQLite ) func main() { // 连接PostgreSQL client, err := ent.Open("postgres", "host=localhost port=5432 user=postgres dbname=myapp password=password sslmode=disable") if err != nil { log.Fatalf("failed opening connection to postgres: %v", err) } defer client.Close() // 运行自动迁移 if err := client.Schema.Create(context.Background()); err != nil { log.Fatalf("failed creating schema resources: %v", err) } ctx := context.Background() // 创建用户 user, err := client.User. Create(). SetName("张三"). SetAge(30). SetEmail("zhangsan@example.com"). Save(ctx) if err != nil { log.Fatalf("failed creating user: %v", err) } log.Println("user was created: ", user) } 2.5 使用SQLite3(非CGO驱动) 📋 使用场景 为什么使用非CGO的SQLite驱动? ...

2025-12-12 · 51 分钟 · czyt