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库有以下性能优势:

  1. 更少的内存分配
  2. 更快的字符串拼接
  3. 更高效的参数处理
  4. 减少不必要的接口转换

这些优化使得在高并发场景下,sqrl能提供更好的性能表现。

sqrl是一个强大而高效的SQL查询构建器,特别适合需要高性能SQL构建的Go应用程序。它的API设计直观,与标准库无缝集成,是构建复杂SQL查询的优秀选择。

回到顶部