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 APIgithub.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
更多关于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
}
性能优化建议
-
连接池配置:
sqlDB, err := db.DB() sqlDB.SetMaxIdleConns(10) sqlDB.SetMaxOpenConns(100) sqlDB.SetConnMaxLifetime(time.Hour)
-
批量操作:
var users = []User{{Name: "user1"}, {Name: "user2"}} db.CreateInBatches(users, 100) // 每次批量插入100条
-
禁用默认事务:
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{ SkipDefaultTransaction: true, })
注意事项
- SQLite是文件型数据库,并发写入性能有限
- 生产环境需要考虑数据库备份策略
- 对于复杂查询,可能需要手动编写SQL语句
- SQLite类型系统较为灵活,需要注意类型转换
通过结合go-sqlite3和GORM,可以在Go项目中高效地使用SQLite数据库,既保持了SQLite轻量级的优势,又获得了ORM的便利性。