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

相关推荐
卓怡学长1 分钟前
m280本科生导师指导平台
java·数据库·spring·tomcat·maven·intellij-idea
大尚来也2 分钟前
Serverless架构深度解析:适用场景、核心局限与破局之道
数据库
Wave84511 分钟前
非阻塞按键(单击,双击,长按)
数据库
2401_8318249617 分钟前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
久违的太阳18 分钟前
记录一次ORACLE RAC安装PSU补丁步骤
数据库·oracle
2401_8796938719 分钟前
用Pygame开发你的第一个小游戏
jvm·数据库·python
xushichao198928 分钟前
实战:用OpenCV和Python进行人脸识别
jvm·数据库·python
sthnyph41 分钟前
初识MySQL · 库的操作
数据库·mysql
原来是猿41 分钟前
MySQL【视图】
数据库·mysql
2401_873587821 小时前
MySQL——事务管理
数据库·mysql