2017-04-05 69 views
2

我正在和的NodeJS PG-承諾,並試圖完成這樣出頭的動態插入:和的NodeJS PG-承諾,從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); 
    }); 
+0

'VALUES($ 1:json)' –

+0

對於列? –

+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

+0

獲取TypeError:無法讀取未定義的屬性'ColumnSet'。 –

+0

我的pgp被定義爲var pgp = pgPromise('postgres:// my-user @ localhost/my-db'); –

+0

作品!對不起這是我的錯。 –