How do I properly insert multiple rows into PG with node-postgres?
Use pg-format like below.
var format = require('pg-format');var values = [ [7, 'john22', 'john22@gmail.com', '9999999922'], [6, 'testvk', 'testvk@gmail.com', '88888888888']];client.query(format('INSERT INTO users (id, name, email, phone) VALUES %L', values),[], (err, result)=>{ console.log(err); console.log(result);});
One other way using PostgreSQL json functions:
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); }});
Following this article: Performance Boost from pg-promise library, and its suggested approach:
// 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 valuesfunction 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(','); };}
An example of using it, exactly as in your case:
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 });
And it will work with an array of objects as well:
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
For a high-performance approach via a single INSERT
query see Multi-row insert with pg-promise.
UPDATE-2
The information here is quite old now, see the latest syntax for Custom Type Formatting. What used to be _rawDBType
is now rawType
, and formatDBType
was renamed into toPostgres
.