转义PostgreSQL字符串值

时间:2018-08-14 17:16:04

标签: node.js postgresql pg pg-promise

我正在尝试将超过70k的值插入到我的postgres数据库中。但是,每一行都有不同类型的特殊字符。当我插入时,我得到通常的错误。例如: syntax error at or near ".5"。我正在使用pg-promise模块。在我正在使用的代码下面:

  function pg_insert(x) {
        var name = x["name"];
        var lastName = x["lasname"];

        var sql = `insert into table(name, lastname)`;
        var values = `values (${name},${lastname})`;

        pg.db
        .none(sql + values)
        .then(data => {})
        .catch(err => {
            console.log(err);
        });
    }

任何帮助将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:3)

卢卡斯(Lukasz)提到,请使用Parameterized Query

  function pg_insert(x) {
    const name = x['name'];
    const lastName = x['lasname'];

    const sql = 'insert into table(name, lastname) values ($1, $2)';
    const values = [name, lastname];

    pg.db
    .none(sql, values)
    .then(data => {})
    .catch(err => {
      console.log(err);
    });
  }

您也可以使用Named Parameters

  function pg_insert(x) {
    const sql = 'insert into table(name, lasname) values (${name}, ${lastname})';

    pg.db
    .none(sql, x)
    .then(data => {})
    .catch(err => {
      console.log(err);
    });
  }

但是,如pg-promise Named Parameters documentation中所述:

  

请记住,虽然属性值null和undefined都设置为null,但是当该属性不存在时会引发错误。

如果传递的对象x中的任何属性都不存在(例如x.namex.lasname{ "name": "Joe" }(请注意缺少的lasname属性)),则上面的“命名参数”示例代码将产生错误。

正如vitaly-t(库创建者)提到的那样,pg-promise中有helper methods可以帮助丢失数据。但是,如果您不能保证将要传递到查询中的数据的形状,并且对添加清理数据所必需的代码不感兴趣,则参数化查询可能是防止故障的更简单选择。

由读者自己决定哪种方法最适合其用例。

答案 1 :(得分:1)

如果您正确使用Named Parameters,它将起作用:

function pg_insert(x) {
    pg.db.none('INSERT INTO table(name, lastname) VALUES(${name}, ${lastname})', x)
    .then(data => {})
    .catch(err => {
        console.log(err);
    });
}

更新

我还修改了official documentation,使其包括以下内容:

  

警告:切勿在ES6模板字符串中使用${}语法,因为这些字符串不知道如何格式化PostgreSQL的值。在ES6模板字符串中,您只能使用4个替代方法之一-$()$<>$[]$//

...使其更加清晰。