4

我正在使用 pq 驱动程序在 Golang 中创建一个使用 Postgres 的应用程序。我想做一个函数,可以从我的数据库中选择一个用户确定的字段,但是我得到一个错误:

pq: 无法确定参数 $1 的数据类型

以下是产生此错误的代码:

var ifc interface{}

if err := conn.QueryRow("SELECT $1 FROM "+db+" WHERE uuid=$3 OR uri=$4 LIMIT 1", field, UUIDOrURI, UUIDOrURI).Scan(&ifc); err != nil {
    if err == sql.ErrNoRows {
        return http.StatusNotFound
    }

    log.Println(err)

    return http.StatusInternalServerError
}

为什么我不能插入我想 SELECT使用的字段$1?还有另一种方法可以做到这一点吗?

4

2 回答 2

1

字段名称不能使用占位符。您必须直接构建查询,如下所示:

"SELECT `" + field + "` FROM "

为避免 SQL 注入,请确保该字段事先是允许字段列表的一部分。

于 2016-10-05T10:17:43.270 回答
-3

恕我直言,创建 SQL 查询的一种更简单但不安全的方法是使用 fmt.Sprintf:

query := fmt.Sprintf("SELECT %s FROM %s WHERE uuid=%s", field, db, UUIDOrURI)
if err := conn.QueryRow(query).scan(&ifc); err != nil {

}

你甚至可以指定一个参数索引:

query := fmt.Sprintf("SELECT %[2]s FROM %[1]s", db, field)

为了方便开发,我推荐使用一个包进行postgresql通信,我试过这个,效果很好。

于 2016-10-05T10:53:38.960 回答