golang轻量级SQL构建DSL插件库sqlingo的使用
golang轻量级SQL构建DSL插件库sqlingo的使用
sqlingo 是一个Go语言中的SQL DSL(也称为SQL构建器或ORM)库。它能从数据库生成代码,让你以优雅的方式编写SQL查询。
特性
- 从数据库自动生成DSL对象和模型结构体,无需手动保持同步
- 支持SQL DML(SELECT/INSERT/UPDATE/DELETE)和一些高级SQL查询语法
- 许多常见错误可以在编译时检测到
- 可以在编辑器/IDE中使用特性,如自动补全字段和查询,或查找字段或表的用法
- 支持上下文
- 支持事务
- 支持拦截器
- 支持Golang的time.Time类型,也可以通过添加
-timeAsString
参数在生成模型时使用字符串类型
数据库支持状态
数据库 | 状态 |
---|---|
MySQL | 稳定 |
PostgreSQL | 实验性支持 |
SQLite | 实验性支持 |
教程
安装和使用sqlingo代码生成器
第一步是从数据库生成代码。为了生成代码,sqlingo要求你的表已经在数据库中创建。
$ go install github.com/lqs/sqlingo/sqlingo-gen-mysql@latest
$ mkdir -p generated/sqlingo
$ sqlingo-gen-mysql root:123456@/database_name >generated/sqlingo/database_name.dsl.go
编写应用程序
下面是一些简单和高级的sqlingo用法示例:
package main
import (
"github.com/lqs/sqlingo"
. "./generated/sqlingo"
)
func main() {
db, err := sqlingo.Open("mysql", "root:123456@/database_name")
if err != nil {
panic(err)
}
// 一个简单的查询
var customers []*CustomerModel
db.SelectFrom(Customer).
Where(Customer.Id.In(1, 2)).
OrderBy(Customer.Name.Desc()).
FetchAll(&customers)
// 从多个表查询
var customerId int64
var orderId int64
err = db.Select(Customer.Id, Order.Id).
From(Customer, Order).
Where(Customer.Id.Equals(Order.CustomerId), Order.Id.Equals(1)).
FetchFirst(&customerId, &orderId)
// 子查询和计数
count, err := db.SelectFrom(Order)
Where(Order.CustomerId.In(db.Select(Customer.Id).
From(Customer).
Where(Customer.Name.Equals("Customer One")))).
Count()
// 分组并自动转换为map
var customerIdToOrderCount map[int64]int64
err = db.Select(Order.CustomerId, f.Count(1)).
From(Order).
GroupBy(Order.CustomerId).
FetchAll(&customerIdToOrderCount)
if err != nil {
println(err)
}
// 插入一些行
customer1 := &CustomerModel{name: "Customer One"}
customer2 := &CustomerModel{name: "Customer Two"}
_, err = db.InsertInto(Customer).
Models(customer1, customer2).
Execute()
// 使用on-duplicate-key-update插入
_, err = db.InsertInto(Customer).
Fields(Customer.Id, Customer.Name).
Values(42, "Universe").
OnDuplicateKeyUpdate().
Set(Customer.Name, Customer.Name.Concat(" 2")).
Execute()
}
这个示例展示了sqlingo的主要功能,包括基本查询、多表查询、子查询、分组统计、数据插入等操作。sqlingo提供了类型安全的SQL构建方式,能帮助开发者更高效地编写数据库操作代码。
更多关于golang轻量级SQL构建DSL插件库sqlingo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang轻量级SQL构建DSL插件库sqlingo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang轻量级SQL构建DSL插件库sqlingo使用指南
sqlingo是一个轻量级的Go语言SQL构建DSL库,它提供了一种类型安全、流畅的API来构建SQL查询,而不需要直接编写SQL字符串。
主要特性
- 类型安全的SQL构建
- 流畅的API设计
- 支持大多数常见SQL操作
- 轻量级无依赖
- 支持上下文传递
安装
go get github.com/lqs/sqlingo
基本用法
初始化
import (
"database/sql"
"github.com/lqs/sqlingo"
)
func main() {
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
panic(err)
}
sqlDb := sqlingo.NewDatabase(db)
defer sqlDb.Close()
}
查询示例
简单查询
// 构建SQL: SELECT * FROM users WHERE id = 1
rows, err := sqlDb.SelectFrom("users").Where("id = 1").FetchAll()
带参数的查询
// 构建SQL: SELECT * FROM users WHERE id = ? AND name = ?
rows, err := sqlDb.SelectFrom("users").
Where("id = ?", 1).
And("name = ?", "John").
FetchAll()
复杂查询
// 构建SQL: SELECT u.name, o.total FROM users u JOIN orders o ON u.id = o.user_id WHERE u.status = ? ORDER BY o.total DESC LIMIT 10
rows, err := sqlDb.Select("u.name", "o.total").
From("users u").
Join("orders o").On("u.id = o.user_id").
Where("u.status = ?", "active").
OrderBy("o.total DESC").
Limit(10).
FetchAll()
插入数据
// 构建SQL: INSERT INTO users (name, age) VALUES (?, ?)
result, err := sqlDb.InsertInto("users").
Fields("name", "age").
Values("John", 30).
Execute()
批量插入
// 构建SQL: INSERT INTO users (name, age) VALUES (?, ?), (?, ?)
result, err := sqlDb.InsertInto("users").
Fields("name", "age").
Values("John", 30).
Values("Alice", 25).
Execute()
更新数据
// 构建SQL: UPDATE users SET name = ?, age = ? WHERE id = ?
result, err := sqlDb.Update("users").
Set("name", "John Doe").
Set("age", 31).
Where("id = ?", 1).
Execute()
删除数据
// 构建SQL: DELETE FROM users WHERE id = ?
result, err := sqlDb.DeleteFrom("users").
Where("id = ?", 1).
Execute()
高级特性
事务支持
err := sqlDb.Transaction(func() error {
// 在事务中执行操作
_, err := sqlDb.InsertInto("orders").Fields("user_id", "amount").Values(1, 100).Execute()
if err != nil {
return err
}
_, err = sqlDb.Update("users").Set("balance = balance - ?", 100).Where("id = ?", 1).Execute()
return err
})
模型映射
sqlingo支持将查询结果映射到结构体:
type User struct {
ID int `db:"id"`
Name string `db:"name"`
Age int `db:"age"`
}
var users []User
err := sqlDb.SelectFrom("users").Where("age > ?", 18).FetchAll(&users)
条件构建
query := sqlDb.SelectFrom("users")
if filterByName != "" {
query = query.Where("name LIKE ?", "%"+filterByName+"%")
}
if minAge > 0 {
query = query.And("age >= ?", minAge)
}
rows, err := query.FetchAll()
原生SQL支持
rows, err := sqlDb.RawSQL("SELECT * FROM users WHERE id IN (?, ?, ?)", 1, 2, 3).FetchAll()
性能考虑
sqlingo是一个轻量级库,相比直接使用database/sql,它提供了更好的开发体验而几乎不增加性能开销:
- 所有SQL构建都是在内存中完成的字符串操作
- 最终执行的仍然是标准的database/sql查询
- 没有ORM的反射开销
与类似库的比较
- 相比gorm:更轻量,不提供迁移、关联等ORM功能
- 相比sqlx:提供更丰富的SQL构建能力
- 相比squirrel:API设计更简洁
总结
sqlingo是一个非常适合需要灵活构建SQL但又不想使用全功能ORM的场景。它提供了:
- 类型安全的SQL构建
- 流畅的API设计
- 轻量级实现
- 与标准库的良好集成
对于中小型项目或需要精细控制SQL的场景,sqlingo是一个很好的选择。