省略列名/将对象直接插入node-postgres

时间:2016-05-19 03:40:59

标签: node.js postgresql node-postgres

我想将列名称作为 keys 传递给词典,从而避免在查询本身中声明列名(直接键入它们)。

假设我有一个包含2个列名的表User

  • idUser(INT)
  • fullName(VARCHAR)

要使用node-postgres创建记录,我需要在查询中声明列名称,如下所示:

    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 个答案:

答案 0 :(得分:4)

使用pg-promise执行此操作的完整示例:

const pgp = require('pg-promise')(/*options*/);
const cn = 'postgres://username:password@host: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')

答案 1 :(得分: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' ] }