我是pg-promise的作者。
pg-promise 中的所有查询方法都依赖于默认查询格式,以提高可靠性,即当查询模板引用属性时,该属性必须存在,否则会引发错误。保持这种状态是合乎逻辑的,因为如果查询中的属性尚未被值替换,则无法正确执行。
在内部,查询引擎通过方法as.format 支持高级查询格式化选项,例如partial 和default。库中有几个使用这些选项的对象。
您应该特别使用helpers.insert 来生成插入,它可以生成单插入和多插入查询。该方法以及更有用的helpers.update 使用类型ColumnSet,它是高度可配置的,通过类型Column 支持缺少属性的默认值(除其他外)。
使用ColumnSet,您可以为选择性列或所有列指定默认值。
例如,假设c 列可能丢失,在这种情况下,我们希望将其设置为null:
var pgp = require('pg-promise')({
capSQL: true // to capitalize all generated SQL
});
// declaring a reusable ColumnSet object:
var csInsert = new pgp.helpers.ColumnSet(['a', 'b',
{
name: 'c',
def: null
}
], {table: 'some_table'});
var data = {a:1, b:'text'};
// generating our insert query:
var insert = pgp.helpers.insert(data, csInsert);
//=> INSERT INTO "some_table"("a","b","c") VALUES(1,'text',null)
这使得自动生成多插入查询成为可能:
var data = [{a:1, b:'text'}, {a:2, b:'hello'}];
// generating a multi-insert query:
var insert = pgp.helpers.insert(data, csInsert);
//=> INSERT INTO "some_table"("a","b","c") VALUES(1,'text',null),(2,'hello',null)
同样的方法适用于单更新和多更新查询。
总而言之,对于您最初的问题:
是否可以直接传递默认选项而不预先格式化查询?
不,也不应该。相反,您应该使用helpers 命名空间中的上述方法来生成正确的查询。它们更强大、更灵活;)