sql - 在go中参数化sql查询

标签 sql postgresql go

我有一个简单的查询,如下所示。

select json_agg(row_to_json(t)) from (select *                                                       
               from jobs, companies, locations                                                                                                                                                                                                                                 
               where jobs.company_id = companies.id and jobs.location_id = locations.id                                                                                                                                                                                        
               $extra                                                                                                                                                                                                                                                          
               and to_tsvector(jobs.name || ' ' || companies.name || ' ' || locations.name) @@ to_tsquery($1)                                                                                                                                                                  
               and to_tsvector(locations.name) @@ to_tsquery($2)                                                                                                                                                                                                               
               limit $3) t

但它在附加查询方面存在一些问题。 $1$2 参数根据查询用户请求是可选的。但是,至少在这种情况下 to_tsquery (postgresql) 不支持任何像 '*' 这样的“全部匹配”查询,所以我们必须有整个附加查询 和 to_tsvector(locations.name ) @@ to_tsquery($2) 使用正确的参数或根本不使用。

这使得基于参数构建查询变得很烦人,因为我们必须一直复制相同的查询并添加额外的查询,而且很容易累加。我有一个解决方案,使用 strings.Replace 来添加额外的查询,但如果需要,我们仍然需要转义参数。有没有其他解决方案可以干净地完成这项工作?

最佳答案

这里是一个棘手的解决方案,希望能对你有所帮助。此查询示例使用 github.com/lib/pq 的语法查询

baseQuery := `
        SELECT *
        FROM
            tableName
        WHERE
            (name ILIKE $1)`

params := []interface{}{"%" + nameLike + "%"}

// you can add optional criteria using this way
if condition==true {
        baseQuery += fmt.Sprintf(` AND student_no=$%d`, len(params)+1)
        params = append(params, studentNo)
}

filterQuery := baseQuery + ` ORDER BY contract_no ASC`

if totalLimit != 0 {
    filterQuery += fmt.Sprintf(` LIMIT $%d OFFSET $%d`, len(params)+1, len(params)+2)
    params = append(params, totalLimit, totalSkip)
}

rows, err := db.Query(filterQuery, params...)

关于sql - 在go中参数化sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29619422/

相关文章:

go - Go程序中goroutines的合理使用

sql - 如何 INSERT - WHERE NOT EXISTS 在另一个具有匹配列的表上?

mysql - 我应该多久索引一次?

postgresql - hstore 针对多列的用例

json - Postgres json 键数

sql - 使用两列创建主键

go - 在 protobuf 的 .proto 文件中将 golang 类型定义为其他类型的一部分

java - 在 postgresql 中使用 group by 选择某些格式

C# - 密码数据库

go - 在 Golang 中将 int 数组转换为字节数组