2017-04-05 10 views
2

JSONオブジェクトから動的に挿入します。NodeJSとPG-約束、私はNodeJSとPG-約束を実行している、など代を達成しようとしている

{"column1":"value1", "column2":"value2", "column3":"value3"} 
{"column2":"value2", "column3":"value3"} 
{"column1":"value1", "column3":"value3"} 

私は、JSONオブジェクトに含まれるものに応じて自動的にINSERTを生成したいと考えています。

エレガントな方法で可能ですか?

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}); 
var cs = new pgp.helpers.ColumnSet(cols, {table: 'my-table'}); 

var cols = Object.keys(inputObj).map(defCol); 

は、それらの列とColumnSetを作成します。

var defCol = name => ({name, def: rawText('DEFAULT')}); 
// which is the same as: 
var defCol = name => new pgp.helpers.Column({name, def: rawText('DEFAULT')}); 

はデフォルトの可能な列のリストを生成しますクラスColumnによると、一般的なデフォルトの列を作成します。挿入クエリを生成する時間です。

var insert = pgp.helpers.insert(inputObj, cs); 

推奨されるアプローチ

事前に列を知っている場合は、あなただけの次実行する必要があります。

var cs = new pgp.helpers.ColumnSet(
        [defCol('column1'), defCol('column2'), defCol('column3')], 
        {table: 'my-table'}); 

静的csオブジェクトは、常により良いパフォーマンスを提供します。

オブジェクトに少なくとも1つのプロパティが存在するかどうかを確認する必要がないため、このアプローチも安全です。 'そうでなければ、生成できないというエラーが表示されます列がないときに挿入します。

また、この方法は複数行の挿入でも機能しますが、これは非常に重要です。参照:Multi-row insert with pg-promise

+0

TypeErrorの取得:未定義の 'ColumnSet'プロパティを読み取ることができません。 –

+0

私のpgpは、var pgp = pgPromise( 'postgres:// my-user @ localhost/my-db')として定義されています。 –

+0

作品!申し訳ありませんが、私の悪い。 –

関連する問題