2016-05-19 13 views
2

カラム名がの辞書を渡したいので、クエリ自体の中でカラム名を宣言することは避けてください。カラム名を省略する/ノード・ポストグラムにオブジェクトを直接挿入する


は、私は2列名を持つテーブルUserがあるとします。node-postgresを使用してレコードを作成するには

  • idUser(INT)
  • fullName(VARCHAR)

、私は内宣言する必要がありますクエリのように列名:

var idUser = 2; 
    var fullName = "John Doe"; 
    var query = 'INSERT INTO User(idUser, age) VALUES ($1, $2)'; 

    database.query(query, [idUser, fullName], function(error, result) { 
     callback(error, result.rows); 
     database.end(); 
    }); 

ちょうどそれがキーからカラム名を推測している辞書&を渡す方法があった場合、私は好む - 私はそれを聞きたいのですが簡単なトリックがある場合は。このような

例えば何か:

var values = { 
     idUser : 2, 
     fullName: "John Doe" 
    }; 
    var query = 'INSERT INTO User VALUES ($1)'; 

    database.query(query, [values], function(error, result) { 
     callback(error, result.rows); 
     database.end(); 
    }); 

答えて

2

ありinsert文のキーと値の値はサポートさませんので、それはネイティブSQLで行うことはできません。

しかし、node-postgres extrasページは複数のSQL生成ツールを言及し、例えばSquel.jsパラメータが非常に近いあなたが探しているもののような方法でSQLを構築するために使用することができます。

squel.insert() 
    .into("User") 
    .setFieldsRows([ 
     { idUser: 2, fullName: "John Doe" } 
    ]) 
    .toParam() 

// => { text: 'INSERT INTO User (idUser, fullName) VALUES (?, ?)', 
//  values: [ 2, 'John Doe' ] } 
2

の完全な例pg-promiseでそれをやって:

const pgp = require('pg-promise')(/*options*/); 
const cn = 'postgres://username:[email protected]:port/database'; 
const db = pgp(cn); 

const values = { 
    idUser: 2, 
    fullName: 'John Doe' 
}; 

// generating the insert query: 
const query = pgp.helpers.insert(values, null, 'User'); 
//=> INSERT INTO "User"("idUser","fullName") VALUES(2,'John Doe') 

db.none(query) 
    .then(data => { 
     // success; 
    }) 
    .catch(error => { 
     // error; 
    }); 

そして、それはこれに変更します高性能に重点を置いた:

// generating a set of columns from the object (only once): 
const cs = new pgp.helpers.ColumnSet(values, {table: 'User'}); 

// generating the insert query: 
const query = pgp.helpers.insert(values, cs); 
//=> INSERT INTO "User"("idUser","fullName") VALUES(2,'John Doe') 
+0

おかげで、これは私が探している – andrux90210

関連する問題