Как правильно вставить несколько строк в PG с помощью node-postgres?
одну строку можно вставить так:
client.query("insert into tableName (name, email) values (, ) ", ['john', 'john@gmail.com'], callBack)
этот подход автоматически комментирует любые специальные символы.
Как вставить сразу несколько строк?
мне нужно реализовать это:
"insert into tableName (name, email) values ('john', 'john@gmail.com'), ('jane', 'jane@gmail.com')"
Я могу просто использовать строковые операторы js для компиляции таких строк вручную, но тогда мне нужно как-то добавить специальные символы.
3 ответов
после этой статьи: Производительность С pg-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 ', Inserts(', ', 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 ', Inserts('${name}, ${age}', users))
.then(data=> {
// OK, all records have been inserted
})
.catch(error=> {
// Error, no records inserted
});
обновление
для высокопроизводительного подхода с помощью одного INSERT
запрос см. многорядная вставка с pg-promise.
еще один способ использования функций PostgreSQL json:
client.query('INSERT INTO table (columns) ' +
'SELECT m.* FROM json_populate_recordset(null::your_custom_type, ) 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 (, ),(, ) ", ['john', 'john@gmail.com','john', 'john@gmail.com'], callBack)
не помогает? Кроме того, вы можете вручную создать строку для запроса:
insert into tableName (name, email) values (" +var1 + "," + var2 + "),(" +var3 + ", " +var4+ ") "
Если Вы читаете здесь,https://github.com/brianc/node-postgres/issues/530, Вы можете увидеть ту же реализацию.