2016-05-19 5 views
2

Ich würde Wörterbücher mit Spaltennamen wie Schlüssel übergeben, damit die Spaltennamen innerhalb der Abfrage selbst zu deklarieren (sie direkt eingeben).Auslassen von Spaltennamen/Einfügen von Objekten direkt in Node-Postgres


Angenommen ich User mit 2 Spaltennamen haben eine Tabelle:

  • idUser(INT)
  • fullName(VARCHAR)

So erstellen Sie einen Datensatz mit node-postgres, ich werde müssen erklären innerhalb die Abfrage die Spaltennamen wie folgt:

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

ich lieber, wenn es eine Möglichkeit, nur einen Wörterbuch ist passieren & hat es die Spaltennamen aus den Tasten schließen - Wenn ein einfacher Trick gibt es würde ich es gerne hören.

Z. B etwas wie folgt aus:

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

Antwort

2

Es gibt keine Unterstützung für Schlüssel-Wert-Werte in der insert Aussage, so kann es nicht mit nativen SQL erfolgen.

jedoch die node-postgres extras Seite erwähnt mehrere SQL-Generation-Tools und zum Beispiel Squel.js Parameter verwendet werden können SQL in einer Weise zu konstruieren, ganz in der Nähe wie das, was Sie suchen:

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

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

Ein vollständiges Beispiel tun sie es mit 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; 
    }); 

Und mit Fokus auf hohe Leistung es dies ändern würde:

// 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

Danke Bro, das ist ich suche – andrux90210