golang高性能SQL查询构建器插件库sqrl的使用
Golang高性能SQL查询构建器插件库sqrl的使用
sqrl是squirrel的精简版,一个Go语言的流式SQL生成器。
简介
sqrl是squirrel的非线程安全分支,移除了额外的字母,保留了相同的便捷功能。
import "github.com/elgris/sqrl"
要求Go 1.8或更高版本
为什么选择sqrl
- 性能更高(根据基准测试)
- 保留了squirrel的所有语法糖
- 支持JOINs、子查询和别名
使用示例
sqrl不是一个ORM,它帮助你从可组合的部分构建SQL查询。注意:sqrl是非线程安全的。
基本查询
import sq "github.com/elgris/sqrl" // 也可以轻松替换为github.com/lann/squirrel
users := sq.Select("*").From("users").Join("emails USING (email_id)")
active := users.Where(sq.Eq{"deleted_at": nil})
sql, args, err := active.ToSql()
// sql == "SELECT * FROM users JOIN emails USING (email_id) WHERE deleted_at IS NULL"
插入数据
sql, args, err := sq.
Insert("users").Columns("name", "age").
Values("moe", 13).Values("larry", sq.Expr("? + 5", 12)).
ToSql()
// sql == "INSERT INTO users (name,age) VALUES (?,?),(?,? + 5)"
执行查询
stooges := users.Where(sq.Eq{"username": []string{"moe", "larry", "curly", "shemp"}})
three_stooges := stooges.Limit(3)
rows, err := three_stooges.RunWith(db).Query()
// 等同于:
rows, err := db.Query("SELECT * FROM users WHERE username IN (?,?,?,?) LIMIT 3", "moe", "larry", "curly", "shemp")
条件查询
if len(q) > 0 {
users = users.Where("name LIKE ?", q)
}
MySQL特定功能
多表删除
sql, args, err := sq.Delete("a1", "a2").
From("z1 AS a1").
JoinClause("INNER JOIN a2 ON a1.id = a2.ref_id").
Where("b = ?", 1).
ToSql()
sql, args, err := sq.Delete("a1").
Using("a2").
Where("a1.id = a2.ref_id AND a2.num = ?", 42).
ToSql()
PostgreSQL特定功能
更新并返回
sql, args, err := sq.Update("a1").
Set("foo", 1).
From("a2").
Where("id = a2.ref_id AND a2.num = ?", 42).
ToSql()
删除并返回
sql, args, err := sq.Delete("a1").
Using("a2").
Where("id = a2.ref_id AND a2.num = ?", 42).
ToSql()
返回子句
sql, args, err := Update("a").
Set("foo", 1).
Where("id = ?", 42).
Returning("bar").
ToSql()
JSON值
sql, args, err := sq.Insert("posts").
Columns("content", "tags").
Values("Lorem Ipsum", pg.JSONB([]string{"foo", "bar"})).
ToSql()
数组值
sql, args, err := sqrl.Insert("posts").
Columns("content", "tags").
Values("Lorem Ipsum", pg.Array([]string{"foo", "bar"})).
ToSql()
完整示例
下面是一个完整的示例,展示如何使用sqrl构建和执行查询:
package main
import (
"database/sql"
"fmt"
"log"
sq "github.com/elgris/sqrl"
_ "github.com/lib/pq" // PostgreSQL驱动
)
func main() {
// 连接数据库
db, err := sql.Open("postgres", "user=postgres dbname=test sslmode=disable")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 构建查询
query := sq.Select("id", "name", "email").
From("users").
Where(sq.Eq{"active": true}).
OrderBy("name ASC").
Limit(10)
// 获取SQL和参数
sql, args, err := query.ToSql()
if err != nil {
log.Fatal(err)
}
fmt.Println("SQL:", sql)
fmt.Println("Args:", args)
// 执行查询
rows, err := query.RunWith(db).Query()
if err != nil {
log.Fatal(err)
}
defer rows.Close()
// 处理结果
for rows.Next() {
var id int
var name, email string
if err := rows.Scan(&id, &name, &email); err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %d, Name: %s, Email: %s\n", id, name, email)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
}
许可证
sqrl采用MIT许可证发布。
更多关于golang高性能SQL查询构建器插件库sqrl的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang高性能SQL查询构建器插件库sqrl的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用sqrl构建高性能SQL查询
sqrl是一个Go语言的SQL查询构建器库,它是Squirrel库的一个高性能分支,专注于提供更快的查询构建能力。下面我将介绍sqrl的基本用法和示例代码。
安装sqrl
go get github.com/elgris/sqrl
基本查询构建
SELECT查询
import "github.com/elgris/sqrl"
// 简单SELECT查询
sql, args, err := sqrl.Select("id", "name", "email").
From("users").
Where(sqrl.Eq{"active": true}).
Limit(10).
ToSql()
// 输出: SELECT id, name, email FROM users WHERE active = ? LIMIT 10
// args: [true]
复杂WHERE条件
// 复杂条件查询
sql, args, err := sqrl.Select("*").
From("orders").
Where(sqrl.And{
sqrl.Gt{"amount": 100},
sqrl.Or{
sqrl.Eq{"status": "completed"},
sqrl.Eq{"status": "processing"},
},
}).
OrderBy("created_at DESC").
ToSql()
// 输出: SELECT * FROM orders WHERE (amount > ?) AND ((status = ?) OR (status = ?)) ORDER BY created_at DESC
// args: [100 "completed" "processing"]
INSERT操作
// 单条插入
sql, args, err := sqrl.Insert("users").
Columns("name", "email", "created_at").
Values("John Doe", "john@example.com", time.Now()).
ToSql()
// 批量插入
sql, args, err := sqrl.Insert("users").
Columns("name", "email").
Values("Alice", "alice@example.com").
Values("Bob", "bob@example.com").
ToSql()
UPDATE操作
sql, args, err := sqrl.Update("users").
Set("name", "John Smith").
Set("email", "john.smith@example.com").
Where(sqrl.Eq{"id": 123}).
ToSql()
DELETE操作
sql, args, err := sqrl.Delete("users").
Where(sqrl.Eq{"id": 123}).
ToSql()
高级功能
子查询
subQuery := sqrl.Select("user_id").From("orders").Where(sqrl.Gt{"amount": 1000})
sql, args, err := sqrl.Select("*").
From("users").
Where(sqrl.Eq{"id": subQuery}).
ToSql()
JOIN操作
sql, args, err := sqrl.Select("u.name", "o.amount").
From("users u").
Join("orders o ON u.id = o.user_id").
Where(sqrl.Gt{"o.amount": 100}).
ToSql()
条件表达式
active := true
query := sqrl.Select("*").From("users")
if active {
query = query.Where(sqrl.Eq{"active": true})
}
if search != "" {
query = query.Where(sqrl.Like{"name": "%" + search + "%"})
}
sql, args, err := query.ToSql()
与数据库交互
sqrl可以与标准库的sql.DB一起使用:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/elgris/sqrl"
)
func main() {
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
panic(err)
}
defer db.Close()
// 使用sqrl构建查询并执行
query := sqrl.Select("id", "name").From("users").Where(sqrl.Eq{"active": true})
rows, err := query.RunWith(db).Query()
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
panic(err)
}
fmt.Println(id, name)
}
}
性能优势
sqrl相比原始Squirrel库有以下性能优势:
- 更少的内存分配
- 更快的字符串拼接
- 更高效的参数处理
- 减少不必要的接口转换
这些优化使得在高并发场景下,sqrl能提供更好的性能表现。
sqrl是一个强大而高效的SQL查询构建器,特别适合需要高性能SQL构建的Go应用程序。它的API设计直观,与标准库无缝集成,是构建复杂SQL查询的优秀选择。