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等)
  • 具有丰富的表达式构建功能

相比squirrelgoqu在处理复杂SQL表达式方面更加灵活和强大,特别适合需要构建复杂WHERE条件的场景。

回到顶部