NodeJS和pg-promise,从JSON对象dynamic插入

我正在运行NodeJS和pg-promise,并正在尝试完成诸如:

db.none('INSERT INTO my-table (JSON-object-keys) VALUES ($1)', [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"} 

我希望INSERTS根据JSON对象包含的内容自动生成。

这是否可能以优雅的方式?

更多的解释,在JSON的3个例子中应该产生以下内容:

 db.none('INSERT INTO my-table (column1, column2, column3) VALUES ($1, $2, $3)', [value1, value2, value3]) .catch(function(err) { console.log('Error on insert into my-table: ' + err); }); db.none('INSERT INTO my-table (column2, column3) VALUES ($1, $2)', [value2, value3]) .catch(function(err) { console.log('Error on insert into my-table: ' + err); }); db.none('INSERT INTO my-table (column1, column3) VALUES ($1, $2)', [value1, value3]) .catch(function(err) { console.log('Error on insert into my-table: ' + err); }); 

你的pgp对象+包含所有属性的input对象:

 var pgp = require('pg-promise')({ capSQL: true // capitalize all generated SQL }); var inputObj = { /* all your optional properties */ }; 

使用“ 自定义types格式”定义原始文本types:

 var rawText = text => ({_rawType: true, toPostgres: () => text}); 

根据类Column创build一个通用的默认列:

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

用这些列创build一个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对象将始终提供更好的性能。

这种方法也比较安全,因为您不需要validation对象中是否至less有一个属性,如果不存在,那么会出现一个错误,指出当存在没有列。

而且这种方法也适用于多行插入,这非常重要。 另请参阅: 使用pg-promise的多行插入 。