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

相关推荐
Rain的Java大神之路2 分钟前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
码途行者32 分钟前
缓存一致性难题:Redis 和数据库如何做到数据一致?
数据库·redis
SelectDB34 分钟前
Doris VARIANT 速查:类型映射、建表写法、索引配置与常见注意点
大数据·数据库·数据分析
l1t1 小时前
几种数据库软件count(distinct)和count()from group by子查询性能测试
开发语言·数据库
夜雪一千1 小时前
如何在MySQL中实现字段级加密
android·数据库·mysql
CJi0NG1 小时前
【自用】MySQL-存储引擎
数据库·mysql
weixin_460443561 小时前
在线考试人脸识别如何合规?本地活体检测、人脸模板加密与替代认证的技术架构设计
大数据·数据库·煤矿培训考试系统·煤矿在线考试系统·煤矿安全培训·煤矿考试系统
deepseek231 小时前
SQLite WAL 开了仍报 database is locked?Python 后台任务的事务与幂等修复
数据库·python·sqlite·并发编程·wal
鶴哥只手遮天1 小时前
第 06 章 SQLite 持久化契约与数据模型
人工智能·开源