sql 等号左边的位置参数

sql positional parameters on the left side of an equals sign

尝试对 postgres 9 进行 sql 更新。注意等号左侧的 $1。那将是传入的 table 中的列名。当我对列名进行硬编码时,更新工作完美。但是当我尝试将该列作为参数($1)传递时,更新失败。为什么,我该如何解决这个问题?

pg.connect(connectionString,function (err, client) {
    client.query("UPDATE people SET  =  WHERE pin =  RETURNING pin",
      [param1, param2, param3], function(err, result){
        if(err) {
            console.log("Error updating data: ", err);
            res.send(false);
        }else{
          res.send(true);
        }
      });
  });

client.query 在内部使用预处理语句,以便您的查询在两个 SQL 语句中执行:

PREPARE some_generated_name AS
UPDATE people SET  =  WHERE pin =  RETURNING pin;

EXECUTE some_generated_name('data1', 'data2', 'data3');

如果您想多次执行同一个查询,这是一种合理的方法。 PREPARE 告诉 PostgreSQL 提前解析和计划查询,因为很多 EXECUTE 语句即将到来,他应该做好准备。

然后 PostgreSQL 提前做他能做的一切,这包括解析和计划。解析意味着他在语法上验证查询并 "understand" 它,计划意味着他试图预测将在哪个 table 上执行哪个操作。

这是 PostgreSQL 尝试将声明式 SQL 转换为程序指令集的部分,例如 "fetch this particular table"、"update this column in this table where this column match this variable"、...(在练习这个系统要复杂得多但真的很有趣)

问题是无法使用动态列名进行解析,因此 PostgreSQL 拒绝PREPARE您的查询。

您不应使用列变量,您必须使用固定命名的列,因为众所周知的列数量有限,使用白名单来验证用户输入并使用简单的字符串连接。