Golang中SQL生成器的使用建议
Golang中SQL生成器的使用建议
也许有人知道用于生成SQL语句的库。例如我找到了 https://github.com/Masterminds/squirrel,但在WHERE子句处理双值方面存在小问题(我指的是类似 WHERE (id, name) IN ((?,?)(?,?)) 这样的情况)
3 回复
你不理解我的意思。我想找一个SQL语句构造器。
更多关于Golang中SQL生成器的使用建议的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我使用了这个:“github.com/denisenkom/go-mssqldb”
示例:
db, errdb := sql.Open("mssql", "server=localhost;user id=sa;password=4553;database=bank")
if errdb != nil {
fmt.Println(" Error open db:", errdb.Error())
}
defer db.Close()
对于在Golang中处理复杂SQL查询,特别是在WHERE子句中使用多列IN条件的情况,我推荐使用goqu库。它提供了更强大的表达式构建能力,能够优雅地处理你提到的WHERE (id, name) IN ((?,?),(?,?))这类场景。
以下是具体的使用示例:
package main
import (
"fmt"
"github.com/doug-martin/goqu/v9"
)
func main() {
dialect := goqu.Dialect("mysql")
// 构建多列IN查询
query, args, _ := dialect.From("users").
Where(goqu.Tuple("id", "name").In(
goqu.Tuple(1, "John"),
goqu.Tuple(2, "Jane"),
goqu.Tuple(3, "Bob"),
)).
ToSQL()
fmt.Println("SQL:", query)
fmt.Println("Args:", args)
}
输出结果:
SQL: SELECT * FROM `users` WHERE (`id`, `name`) IN ((1, 'John'), (2, 'Jane'), (3, 'Bob'))
Args: []
对于需要预编译参数的情况:
func main() {
dialect := goqu.Dialect("mysql")
// 使用预编译参数
query, args, _ := dialect.From("users").
Where(goqu.Tuple("id", "name").In(
goqu.Tuple(goqu.V(1), goqu.V("John")),
goqu.Tuple(goqu.V(2), goqu.V("Jane")),
goqu.Tuple(goqu.V(3), goqu.V("Bob")),
)).
Prepared(true).
ToSQL()
fmt.Println("SQL:", query)
fmt.Println("Args:", args)
}
输出结果:
SQL: SELECT * FROM `users` WHERE (`id`, `name`) IN ((?, ?), (?, ?), (?, ?))
Args: [1 John 2 Jane 3 Bob]
goqu还支持更复杂的条件组合:
// 复杂条件示例
query, args, _ := dialect.From("users").
Where(goqu.And(
goqu.Tuple("id", "status").In(
goqu.Tuple(1, "active"),
goqu.Tuple(2, "inactive"),
),
goqu.C("created_at").Gt(goqu.L("DATE_SUB(NOW(), INTERVAL 7 DAY)")),
)).
ToSQL()
goqu库的优势在于:
- 支持多列元组表达式
- 提供类型安全的查询构建
- 支持多种SQL方言(MySQL、PostgreSQL、SQLite等)
- 具有丰富的表达式构建功能
相比squirrel,goqu在处理复杂SQL表达式方面更加灵活和强大,特别适合需要构建复杂WHERE条件的场景。

