golang嵌入式SQLite数据库驱动与GORM支持插件库go-sqlite3的使用

Golang嵌入式SQLite数据库驱动与GORM支持插件库go-sqlite3的使用

介绍

github.com/ncruces/go-sqlite3是一个不使用cgo的SQLite封装库。它提供了兼容database/sql的驱动,以及直接访问大多数C SQLite API的能力。

该库封装了SQLite的Wasm构建版本,并使用wazero作为运行时。Go、wazero和x/sys是唯一的直接依赖项。

快速开始

使用database/sql驱动

import "database/sql"
import _ "github.com/ncruces/go-sqlite3/driver"
import _ "github.com/ncruces/go-sqlite3/embed"

var version string
db, _ := sql.Open("sqlite3", "file:demo.db")
db.QueryRow(`SELECT sqlite_version()`).Scan(&version)

包结构

  • github.com/ncruces/go-sqlite3 - 封装C SQLite API
  • github.com/ncruces/go-sqlite3/driver - 提供database/sql驱动
  • github.com/ncruces/go-sqlite3/embed - 将SQLite构建嵌入到应用程序中
  • github.com/ncruces/go-sqlite3/vfs - 封装C SQLite VFS API并提供纯Go实现
  • github.com/ncruces/go-sqlite3/gormlite - 提供GORM驱动

使用GORM的完整示例

package main

import (
	"fmt"
	"log"
	
	"github.com/ncruces/go-sqlite3/gormlite"
	"gorm.io/gorm"
)

// 定义模型
type Product struct {
	gorm.Model
	Code  string
	Price uint
}

func main() {
	// 打开数据库连接
	db, err := gorm.Open(gormlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		log.Fatal(err)
	}

	// 自动迁移
	db.AutoMigrate(&Product{})

	// 创建记录
	db.Create(&Product{Code: "D42", Price: 100})

	// 查询记录
	var product Product
	db.First(&product, "code = ?", "D42") // 查找code为D42的产品
	fmt.Printf("Product: %+v\n", product)

	// 更新记录
	db.Model(&product).Update("Price", 200)
	
	// 删除记录
	db.Delete(&product, product.ID)
}

高级特性

  • 增量BLOB I/O
  • 嵌套事务
  • 自定义函数
  • 虚拟表
  • 自定义VFS
  • 在线备份
  • JSON支持
  • 数学函数
  • 全文搜索
  • 地理空间搜索
  • Unicode支持
  • 统计函数
  • 静态加密
  • 许多扩展

注意事项

该模块用纯Go实现替换了SQLite的OS接口(VFS),这有优点也有缺点。由于每个数据库连接都在Wasm沙盒环境中执行,内存使用量会比替代方案更高。

并发性

该模块的行为类似于SQLite的多线程模式:如果单个数据库连接或其派生的对象不被多个goroutine同时使用,则是goroutine安全的。database/sql API根据其文档可以安全地并发使用。

性能

database/sql驱动的性能与其他替代方案相当。Wasm和VFS层也通过运行SQLite的speedtest1进行基准测试。


更多关于golang嵌入式SQLite数据库驱动与GORM支持插件库go-sqlite3的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang嵌入式SQLite数据库驱动与GORM支持插件库go-sqlite3的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go语言中使用SQLite数据库与GORM集成

SQLite是一个轻量级的嵌入式数据库引擎,在Go语言中可以通过go-sqlite3驱动来使用。结合GORM这个流行的ORM框架,可以更方便地操作SQLite数据库。

go-sqlite3驱动安装与基本使用

首先需要安装go-sqlite3驱动:

go get github.com/mattn/go-sqlite3

基本使用示例

package main

import (
	"database/sql"
	"fmt"
	"log"
	
	_ "github.com/mattn/go-sqlite3"
)

func main() {
	// 打开数据库连接(如果不存在会自动创建)
	db, err := sql.Open("sqlite3", "./test.db")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 创建表
	_, err = db.Exec(`
		CREATE TABLE IF NOT EXISTS users (
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			name TEXT NOT NULL,
			age INTEGER
		)
	`)
	if err != nil {
		log.Fatal(err)
	}

	// 插入数据
	res, err := db.Exec("INSERT INTO users(name, age) VALUES(?, ?)", "张三", 25)
	if err != nil {
		log.Fatal(err)
	}
	id, _ := res.LastInsertId()
	fmt.Printf("插入成功,ID: %d\n", id)

	// 查询数据
	rows, err := db.Query("SELECT id, name, age FROM users")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	for rows.Next() {
		var id, age int
		var name string
		err = rows.Scan(&id, &name, &age)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age)
	}
}

使用GORM操作SQLite

GORM是一个功能强大的Go语言ORM库,支持SQLite等多种数据库。

安装GORM和SQLite驱动

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

GORM基本使用示例

package main

import (
	"fmt"
	"log"
	
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

// 定义模型
type User struct {
	gorm.Model
	Name string
	Age  int
}

func main() {
	// 连接SQLite数据库
	db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
	if err != nil {
		log.Fatal("无法连接数据库:", err)
	}

	// 自动迁移(创建表)
	err = db.AutoMigrate(&User{})
	if err != nil {
		log.Fatal("自动迁移失败:", err)
	}

	// 创建记录
	user := User{Name: "李四", Age: 30}
	result := db.Create(&user)
	if result.Error != nil {
		log.Fatal("创建记录失败:", result.Error)
	}
	fmt.Printf("插入成功,ID: %d\n", user.ID)

	// 查询记录
	var users []User
	db.Find(&users)
	fmt.Println("所有用户:")
	for _, u := range users {
		fmt.Printf("ID: %d, Name: %s, Age: %d, CreatedAt: %v\n", 
			u.ID, u.Name, u.Age, u.CreatedAt)
	}

	// 更新记录
	db.Model(&User{}).Where("name = ?", "李四").Update("age", 31)

	// 删除记录
	// db.Delete(&User{}, 1) // 删除ID为1的记录
}

GORM高级特性

1. 关联关系

type CreditCard struct {
	gorm.Model
	Number string
	UserID uint
}

type User struct {
	gorm.Model
	Name       string
	CreditCard CreditCard
}

// 使用
db.AutoMigrate(&User{}, &CreditCard{})

user := User{
	Name: "王五",
	CreditCard: CreditCard{Number: "123456789"},
}
db.Create(&user)

2. 事务处理

err = db.Transaction(func(tx *gorm.DB) error {
	// 在事务中执行一些操作
	if err := tx.Create(&User{Name: "事务用户"}).Error; err != nil {
		// 返回错误会回滚事务
		return err
	}
	
	if err := tx.Create(&CreditCard{Number: "987654321", UserID: 1}).Error; err != nil {
		return err
	}
	
	// 返回nil提交事务
	return nil
})

3. 钩子函数

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
	fmt.Println("在创建用户前执行")
	if u.Age < 0 {
		return errors.New("年龄不能为负数")
	}
	return
}

性能优化建议

  1. 连接池配置

    sqlDB, err := db.DB()
    sqlDB.SetMaxIdleConns(10)
    sqlDB.SetMaxOpenConns(100)
    sqlDB.SetConnMaxLifetime(time.Hour)
    
  2. 批量操作

    var users = []User{{Name: "user1"}, {Name: "user2"}}
    db.CreateInBatches(users, 100) // 每次批量插入100条
    
  3. 禁用默认事务

    db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
        SkipDefaultTransaction: true,
    })
    

注意事项

  1. SQLite是文件型数据库,并发写入性能有限
  2. 生产环境需要考虑数据库备份策略
  3. 对于复杂查询,可能需要手动编写SQL语句
  4. SQLite类型系统较为灵活,需要注意类型转换

通过结合go-sqlite3和GORM,可以在Go项目中高效地使用SQLite数据库,既保持了SQLite轻量级的优势,又获得了ORM的便利性。

回到顶部