2016-01-25 1 views
8

Одна строка может быть вставлена ​​так:Как правильно вставить несколько строк в PG с помощью node-postgres?

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]mail.com')" 

я могу просто использовать JS строковые операторы собрать такие строки вручную, но мне нужно, чтобы добавить специальные символы бежать как-то.

+0

есть причина, вы не можете просто выполнить INSERT дважды? –

+0

относительно документации pg этот подход очень нежелателен из-за снижения производительности. – stkvtflw

+0

Если выполнение 2 вставок вместо 1 будет угрожать производительности вашего приложения, тогда 'node-postgres' не для вас вообще. Но я считаю, что вы смотрите на это неправильно, пытаясь оптимизировать, где вы не должны. Эта библиотека может легко вставить 10 000 записей менее чем за 1 секунду. –

ответ

2

Следуя этой статье: Performance Boost из 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 $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

Для высокопроизводительного подхода с помощью одного запроса INSERT см. Multi-row insert with pg-promise.

2
client.query("insert into tableName (name, email) values ($1, $2),($3, $4) ", ['john', '[email protected]','john', '[email protected]'], callBack) 

не помогает? Futher больше, вы можете вручную создать строку для запроса:

insert into tableName (name, email) values (" +var1 + "," + var2 + "),(" +var3 + ", " +var4+ ") " 

если вы читаете здесь, https://github.com/brianc/node-postgres/issues/530, вы можете увидеть ту же реализацию.

2

Еще один способ использования PostgreSQL JSon функции:

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); 
     } 
});