我想将列名称作为 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();
});
答案 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' ] }