次のように単一の行を挿入できます。
client.query("insert into tableName (name, email) values ($1, $2) ", ['john', '[email protected]'], callBack)
このアプローチでは、すべての特殊文字が自動的にコメント化されます。
一度に複数の行を挿入するにはどうすればよいですか?
これを実装する必要があります:
"insert into tableName (name, email) values ('john', '[email protected]'), ('jane', '[email protected]')"
Js文字列演算子を使用して、そのような行を手動でコンパイルできますが、特殊文字のエスケープを何らかの方法で追加する必要があります。
この記事の後に: Performance Boostpg-promise ライブラリから、およびその推奨アプローチ:
// Concatenates an array of objects or arrays of values, according to the template,
// to use with insert queries. Can be used either as a class type or as a function.
//
// template = formatting template string
// data = array of either objects or arrays of values
function Inserts(template, data) {
if (!(this instanceof Inserts)) {
return new Inserts(template, data);
}
this._rawDBType = true;
this.formatDBType = function () {
return data.map(d=>'(' + pgp.as.format(template, d) + ')').join(',');
};
}
あなたの場合とまったく同じようにそれを使用する例:
var users = [['John', 23], ['Mike', 30], ['David', 18]];
db.none('INSERT INTO Users(name, age) VALUES $1', Inserts('$1, $2', users))
.then(data=> {
// OK, all records have been inserted
})
.catch(error=> {
// Error, no records inserted
});
また、オブジェクトの配列でも機能します。
var users = [{name: 'John', age: 23}, {name: 'Mike', age: 30}, {name: 'David', age: 18}];
db.none('INSERT INTO Users(name, age) VALUES $1', Inserts('${name}, ${age}', users))
.then(data=> {
// OK, all records have been inserted
})
.catch(error=> {
// Error, no records inserted
});
UPDATE-1
単一のINSERT
クエリによる高パフォーマンスのアプローチについては、 pg-promiseを使用した複数行の挿入 を参照してください。
UPDATE-2
ここの情報はかなり古くなっています。最新の Custom Type Formatting の構文を参照してください。以前は_rawDBType
はrawType
になり、formatDBType
はtoPostgres
に名前が変更されました。
PostgreSQL json関数を使用するもう1つの方法:
client.query('INSERT INTO table (columns) ' +
'SELECT m.* FROM json_populate_recordset(null::your_custom_type, $1) AS m',
[JSON.stringify(your_json_object_array)], function(err, result) {
if(err) {
console.log(err);
} else {
console.log(result);
}
});
client.query("insert into tableName (name, email) values ($1, $2),($3, $4) ", ['john', '[email protected]','john', '[email protected]'], callBack)
助けにはならない?さらに、クエリの文字列を手動で生成できます。
insert into tableName (name, email) values (" +var1 + "," + var2 + "),(" +var3 + ", " +var4+ ") "
https://github.com/brianc/node-postgres/issues/5 を読むと、同じ実装を見ることができます。