如何对操作员进行参数化?

用户776942:

我有以下sql语句:

SELECT pk, up FROM mytable WHERE 2 > 1 LIMIT 10

显然,这只是为了简单起见。我可以参数化任何整数:

SELECT pk, up FROM mytable WHERE 2 > $1 LIMIT 10

但是,当我尝试参数化运算符时,例如:

SELECT pk, up FROM mytable WHERE 2 $1 1 LIMIT 10

我得到:

pq: syntax error at or near "$1"

完整代码:

package main

import (
    "database/sql"
    _ "github.com/lib/pq"
    "log"
)

func main() {
    log.SetFlags(log.Lshortfile)
    Db, err := sql.Open("postgres", "user=yoitsmeletmein password=supersecretyo host=what.a.host dbname=mydb sslmode=require")
    if err != nil {
        log.Fatal("Cannot connect to db: ", err)
    }
    q := `SELECT pk FROM mytable WHERE 2 $1 1 LIMIT 10`
    params := []interface{}{">"}
    rows, err := Db.Query(q, params...)
    if err != nil {
        log.Println(err)
    } else {
        defer rows.Close()
        for rows.Next() {
            var pk int64
            if err := rows.Scan(&pk); err != nil {
                log.Fatal(err)
            }
            log.Println(pk)
        }
    }

}
欧文·布兰德斯特(Erwin Brandstetter):

准备好的语句允许参数化,仅此而已。首先将操作符参数化是没有意义的,在不了解相关操作符的情况下就无法准备语句。打开SQL注入的向量将具有潜在的危险。

要切换运算符,您必须在客户端中连接新的查询字符串,或者将动态SQL与服务器端过程语言一起使用,默认语言为plpgsql。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章