我正在尝试将超过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);
});
}
任何帮助将不胜感激。
谢谢
答案 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.name
,x.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个替代方法之一-$()
,$<>
,$[]
或$//
。
...使其更加清晰。