好用的 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!

相关推荐
十二同学啊4 小时前
向量数据库:从核心原理到 RAG 与 Java 实战
数据库
ZStack开发者社区4 小时前
ZSvirt 开源月报第 1 期 · Around the World
开源·云计算·vmware·虚拟化
冬奇Lab4 小时前
一天一个开源项目(第224篇):ARTEMIS —— 谷歌开源的移动端 AI 自动化框架,让 AI 助手像人一样操作手机
人工智能·开源·测试
蓝速科技5 小时前
会议室门牌公告通知发布选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
caoerzhong6 小时前
JeeWMS 开源仓库管理系统全景解读:一套 Java WMS 如何把 WMS/OMS/BMS/TMS 装进同一个系统
java·开源
一 乐7 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
SelectDB8 小时前
同等资源下 Apache Doris 4.2 vs StarRocks 4.1.1:1TB SSB 与 TPC-H 性能实测
大数据·数据库·数据分析
这个DBA有点耶8 小时前
数据库集群与分布式架构:三条技术路线对比、金仓KES RAC实测数据与决策框架
数据库·程序员·架构
MayBaymax8 小时前
MongoDB 索引与事务
java·数据库·mongodb
SelectDB8 小时前
Doris vs ClickHouse:企业 OLAP 走向下一阶段,两种技术路线如何选择
大数据·数据库·数据分析