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

相关推荐
OurBMC社区15 小时前
玩转OurBMC第二十七期:BMC POST CODE解读
开源·ourbmc
JosieBook16 小时前
【数据库】时序数据库选型指南:从数据模型到大模型智能分析
数据库·时序数据库
哥只是传说中的小白16 小时前
GrsaiApi官方正版字字动画插件!支持nano banana pro和gpt-image-2模型
人工智能·gpt·ai作画·开源·aigc·api
小猿姐16 小时前
Clickhouse Kubernetes Operator 实测:哪种方案更适合生产?
运维·数据库·kubernetes
2501_9219392617 小时前
MHA高可用
数据库·mysql
_Evan_Yao17 小时前
MySQL 基础:SELECT、WHERE、JOIN 的第一次使用
数据库·mysql
weixin_4440129318 小时前
c++如何将std--vector直接DUMP到二进制文件_指针地址直写【附代码】
jvm·数据库·python
woxihuan12345618 小时前
Go语言中--=运算符详解:位右移赋值操作的原理与应用
jvm·数据库·python
java1234_小锋18 小时前
SpringBoot为什么要禁止循环依赖?
java·数据库·spring boot
码途漫谈18 小时前
DocuSeal 介绍:开源文档签署与处理平台
开源