NodeJS和pg-promise,从JSON-object动态插入

时间:2017-04-05 08:12:10

标签: node.js pg-promise

我正在运行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"}

我希望自动生成与JSON对象包含的内容相对应的INSERTS。

这可能是一种优雅的方式吗?

再解释一下,在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);
    });

1 个答案:

答案 0 :(得分:1)

您的pgp对象+包含所有属性的输入对象:

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

var inputObj = {
    /* all your optional properties */
};

使用raw-text定义Custom Type Formatting类型:

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

根据班级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对象将始终提供更好的性能。

这种方法也更安全,因为您不需要验证对象中是否至少有一个属性,'如果没有,则会出现错误,表示无法生成插入当没有列时。

这种方法也适用于多行插入,这非常重要。另见:Multi-row insert with pg-promise