sql位置参数在等号的左侧

时间:2016-04-23 04:42:48

标签: javascript sql postgresql pg

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

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

1 个答案:

答案 0 :(得分:0)

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

PREPARE some_generated_name AS
UPDATE people SET $1 = $2 WHERE pin = $3 RETURNING pin;

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

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

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

这是PostgreSQL尝试将声明性SQL转换为一组程序性指令的部分,例如“获取此特定表”,“在此表中更新此列,此列与此变量匹配”,...(在实践中)这个系统要复杂得多,但非常有趣)

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

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