好用的 SQLite3 ORM 开源库

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!

相关推荐
笃行35036 分钟前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行35041 分钟前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3501 小时前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
冬奇Lab19 小时前
每日一个开源项目(第142篇):android/skills - Google 官方 Android 开发 AI Skill 库
人工智能·开源·资讯
冬奇Lab19 小时前
Skill 系列(06):Skill 工程化与治理——路由准确率 38%、压缩节省 76%
人工智能·开源·agent
SelectDB1 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶1 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵1 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils1 天前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库