NodeJS 和 pg-promise,从 JSON-object 动态插入
NodeJS and pg-promise, insert dynamically from JSON-object
我是 运行 NodeJS 和 pg-promise,正在尝试完成类似的事情:
db.none('INSERT INTO my-table (JSON-object-keys) VALUES ()', [JSON-object-values])
.catch(function(err) {
console.log('Error on insert into my-table: ' + err);
});
我有 JSON 个对象,它们看起来像:
{"column1":"value1", "column2":"value2", "column3":"value3"}
{"column2":"value2", "column3":"value3"}
{"column1":"value1", "column3":"value3"}
我希望根据 JSON-对象包含的内容自动生成 INSERTS。
这有可能以优雅的方式实现吗?
再解释一下,在 JSON 的 3 个示例中,应生成以下内容:
db.none('INSERT INTO my-table (column1, column2, column3) VALUES (, , )', [value1, value2, value3])
.catch(function(err) {
console.log('Error on insert into my-table: ' + err);
});
db.none('INSERT INTO my-table (column2, column3) VALUES (, )', [value2, value3])
.catch(function(err) {
console.log('Error on insert into my-table: ' + err);
});
db.none('INSERT INTO my-table (column1, column3) VALUES (, )', [value1, value3])
.catch(function(err) {
console.log('Error on insert into my-table: ' + err);
});
您的 pgp
对象 + 具有所有属性的输入对象:
var pgp = require('pg-promise')({
capSQL: true // capitalize all generated SQL
});
var inputObj = {
/* all your optional properties */
};
定义 raw-text type, using Custom Type Formatting:
var rawText = text => ({_rawType: true, toPostgres: () => text});
根据 class Column:
创建通用默认列
var defCol = name => ({name, def: rawText('DEFAULT')});
// which is the same as:
var defCol = name => new pgp.helpers.Column({name, def: rawText('DEFAULT')});
生成默认可用列的列表:
var cols = Object.keys(inputObj).map(defCol);
使用这些列创建 ColumnSet:
var cs = new pgp.helpers.ColumnSet(cols, {table: 'my-table'});
当需要生成插入查询时,您可以这样做:
var insert = pgp.helpers.insert(inputObj, cs);
推荐方法
如果您事先知道这些列,那么您只需执行以下操作:
var cs = new pgp.helpers.ColumnSet(
[defCol('column1'), defCol('column2'), defCol('column3')],
{table: 'my-table'});
静态 cs
对象总是会提供更好的性能。
这种方法也更安全,因为你不需要验证对象中是否至少有一个属性,因为如果没有,你会得到一个错误提示没有列时不可能生成插入。
而且这种方法也适用于多行插入,这一点非常重要。另见:.
我是 运行 NodeJS 和 pg-promise,正在尝试完成类似的事情:
db.none('INSERT INTO my-table (JSON-object-keys) VALUES ()', [JSON-object-values])
.catch(function(err) {
console.log('Error on insert into my-table: ' + err);
});
我有 JSON 个对象,它们看起来像:
{"column1":"value1", "column2":"value2", "column3":"value3"}
{"column2":"value2", "column3":"value3"}
{"column1":"value1", "column3":"value3"}
我希望根据 JSON-对象包含的内容自动生成 INSERTS。
这有可能以优雅的方式实现吗?
再解释一下,在 JSON 的 3 个示例中,应生成以下内容:
db.none('INSERT INTO my-table (column1, column2, column3) VALUES (, , )', [value1, value2, value3])
.catch(function(err) {
console.log('Error on insert into my-table: ' + err);
});
db.none('INSERT INTO my-table (column2, column3) VALUES (, )', [value2, value3])
.catch(function(err) {
console.log('Error on insert into my-table: ' + err);
});
db.none('INSERT INTO my-table (column1, column3) VALUES (, )', [value1, value3])
.catch(function(err) {
console.log('Error on insert into my-table: ' + err);
});
您的 pgp
对象 + 具有所有属性的输入对象:
var pgp = require('pg-promise')({
capSQL: true // capitalize all generated SQL
});
var inputObj = {
/* all your optional properties */
};
定义 raw-text type, using Custom Type Formatting:
var rawText = text => ({_rawType: true, toPostgres: () => text});
根据 class Column:
创建通用默认列var defCol = name => ({name, def: rawText('DEFAULT')});
// which is the same as:
var defCol = name => new pgp.helpers.Column({name, def: rawText('DEFAULT')});
生成默认可用列的列表:
var cols = Object.keys(inputObj).map(defCol);
使用这些列创建 ColumnSet:
var cs = new pgp.helpers.ColumnSet(cols, {table: 'my-table'});
当需要生成插入查询时,您可以这样做:
var insert = pgp.helpers.insert(inputObj, cs);
推荐方法
如果您事先知道这些列,那么您只需执行以下操作:
var cs = new pgp.helpers.ColumnSet(
[defCol('column1'), defCol('column2'), defCol('column3')],
{table: 'my-table'});
静态 cs
对象总是会提供更好的性能。
这种方法也更安全,因为你不需要验证对象中是否至少有一个属性,因为如果没有,你会得到一个错误提示没有列时不可能生成插入。
而且这种方法也适用于多行插入,这一点非常重要。另见: