1. GORM (最流行)
安装
bash
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
基本使用
go
package main
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type User struct {
ID uint `gorm:"primaryKey"`
Name string
Age int
Email string `gorm:"uniqueIndex"`
}
func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移
db.AutoMigrate(&User{})
// 创建
user := User{Name: "John", Age: 30, Email: "john@example.com"}
db.Create(&user)
// 查询
var result User
db.First(&result, "name = ?", "John")
}
高级特性
go
// JSON 字段支持
type Product struct {
gorm.Model
Name string
Metadata datatypes.JSON `gorm:"type:json"`
}
// 复杂查询
db.Where("age > ?", 25).Order("created_at desc").Find(&users)
// 事务
db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(&user1).Error; err != nil {
return err
}
if err := tx.Create(&user2).Error; err != nil {
return err
}
return nil
})
2. ent (Facebook 开发)
安装
bash
go get -d entgo.io/ent/cmd/ent
定义 Schema
go
// go generate ./ent
// ent/schema/user.go
package schema
import (
"entgo.io/ent"
"entgo.io/ent/schema/field"
)
type User struct {
ent.Schema
}
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("name"),
field.Int("age").Optional(),
field.String("email").Unique(),
field.JSON("metadata", map[string]interface{}{}).Optional(),
}
}
使用
go
package main
import (
"context"
"log"
"<project>/ent"
"entgo.io/ent/dialect"
_ "github.com/mattn/go-sqlite3"
)
func main() {
client, err := ent.Open(dialect.SQLite, "file:ent?mode=memory&cache=shared&_fk=1")
if err != nil {
log.Fatal(err)
}
defer client.Close()
ctx := context.Background()
// 自动迁移
if err := client.Schema.Create(ctx); err != nil {
log.Fatal(err)
}
// 创建用户
user, err := client.User.
Create().
SetName("Alice").
SetAge(30).
SetEmail("alice@example.com").
Save(ctx)
if err != nil {
log.Fatal(err)
}
// 查询
users, err := client.User.
Query().
Where(user.Name("Alice")).
All(ctx)
}
3. SQLBoiler (代码生成)
安装
bash
go get -u github.com/volatiletech/sqlboiler/v4
go get -u github.com/volatiletech/sqlboiler/v4/drivers/sqlboiler-sqlite3
生成模型
bash
sqlboiler sqlite3
使用
go
package main
import (
"database/sql"
"fmt"
"log"
"github.com/volatiletech/sqlboiler/v4/boil"
"github.com/volatiletech/sqlboiler/v4/queries/qm"
_ "github.com/mattn/go-sqlite3"
"./models" // 生成的模型
)
func main() {
db, err := sql.Open("sqlite3", "test.db")
if err != nil {
log.Fatal(err)
}
boil.SetDB(db)
// 创建
user := models.User{
Name: "Bob",
Age: 25,
Email: "bob@example.com",
}
err = user.Insert(ctx, db, boil.Infer())
// 查询
users, err := models.Users(
qm.Where("age > ?", 20),
qm.OrderBy("created_at DESC"),
).All(ctx, db)
}
4. bun (基于 SQLAlchemy 风格)
安装
bash
go get github.com/uptrace/bun
go get github.com/uptrace/bun/dialect/sqlitedialect
使用
go
package main
import (
"context"
"database/sql"
"fmt"
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/sqlitedialect"
_ "github.com/mattn/go-sqlite3"
)
type User struct {
bun.BaseModel `bun:"table:users,alias:u"`
ID int64 `bun:"id,pk,autoincrement"`
Name string `bun:"name,notnull"`
Age int `bun:"age"`
Email string `bun:"email,unique"`
}
func main() {
ctx := context.Background()
sqldb, err := sql.Open("sqlite3", "file:test.db?cache=shared")
if err != nil {
panic(err)
}
db := bun.NewDB(sqldb, sqlitedialect.New())
defer db.Close()
// 创建表
_, err = db.NewCreateTable().Model((*User)(nil)).IfNotExists().Exec(ctx)
// 插入
user := &User{Name: "Charlie", Age: 35, Email: "charlie@example.com"}
_, err = db.NewInsert().Model(user).Exec(ctx)
// 查询
var users []User
err = db.NewSelect().Model(&users).Where("age > ?", 25).Scan(ctx)
}
5. XORM
安装
bash
go get xorm.io/xorm
使用
go
package main
import (
"log"
_ "github.com/mattn/go-sqlite3"
"xorm.io/xorm"
)
type User struct {
Id int64
Name string `xorm:"unique"`
Age int
Email string
}
func main() {
engine, err := xorm.NewEngine("sqlite3", "./test.db")
if err != nil {
log.Fatal(err)
}
// 同步表结构
err = engine.Sync2(new(User))
// 插入
user := &User{Name: "David", Age: 28, Email: "david@example.com"}
_, err = engine.Insert(user)
// 查询
var result User
has, err := engine.Where("name = ?", "David").Get(&result)
}
6. Beego ORM
安装
bash
go get github.com/beego/beego/v2/client/orm
使用
go
package main
import (
"github.com/beego/beego/v2/client/orm"
_ "github.com/mattn/go-sqlite3"
)
type User struct {
Id int `orm:"auto"`
Name string `orm:"size(100)"`
Age int
}
func init() {
orm.RegisterDriver("sqlite3", orm.DRSqlite)
orm.RegisterDataBase("default", "sqlite3", "test.db")
orm.RegisterModel(new(User))
}
func main() {
o := orm.NewOrm()
user := User{Name: "Eve", Age: 32}
// 插入
id, err := o.Insert(&user)
// 查询
var u User
err = o.QueryTable("user").Filter("name", "Eve").One(&u)
}
对比总结
ORM | 学习曲线 | 性能 | 代码生成 | 特性丰富度 | 推荐场景 |
---|---|---|---|---|---|
GORM | 中等 | 良好 | 否 | 丰富 | 快速开发,全功能ORM |
ent | 较陡 | 优秀 | 是 | 非常丰富 | 大型项目,类型安全 |
SQLBoiler | 中等 | 优秀 | 是 | 中等 | 高性能,数据库优先 |
bun | 中等 | 良好 | 否 | 丰富 | SQL 友好,功能全面 |
XORM | 简单 | 良好 | 否 | 中等 | 简单项目,易上手 |
Beego ORM | 简单 | 良好 | 否 | 基础 | Beego 生态,简单CRUD |
推荐选择:
- 新手/快速开发:GORM
- 企业级/类型安全:ent
- 高性能/数据库优先:SQLBoiler
- SQL 友好:bun
- 简单项目:XORM 或 Beego ORM
根据你的项目需求和技术偏好选择合适的 ORM!