'default' pgp.as.format() 中的选项

'default' option in pgp.as.format()

我需要使用 default 选项格式化 SQL 查询以查找缺少的对象字段。我可以通过外部调用 pgp.as.format:

来完成
let formattedQuery = pgp.as.format('INSERT INTO some_table (a,b,c) VALUES ($(a), $(b), $(c))', object, {default: null}); 
db.none(formattedQuery); 

是否可以直接传递 default 选项而不预先格式化查询?基本上,我想做这样的事情:

db.none('INSERT INTO some_table (a,b,c) VALUES ($(a), $(b), $(c))', object, {default: null})

我是 pg-promise 的作者。


pg-promise中的所有查询方法都依赖于默认查询格式,以获得更好的可靠性,即当查询模板引用 属性 时,属性 必须存在,否则抛出一个错误。保持这种状态是合乎逻辑的,因为如果其中的属性未被替换为值,则查询无法正确执行。

在内部,查询引擎通过方法 as.format 支持高级查询格式化选项,例如 partialdefault。库中有几个对象使用了这些选项。

一个特别应该用于生成插入的是 helpers.insert, which can generate both single-insert and multi-insert queries. That method, along with even more useful helpers.update make use of type ColumnSet, which is highly configurable, supporting default values for missing properties (among other things), via type 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)

同样的方法适用于单更新和多更新查询。

总而言之,对于你原来的问题:

Is it possible to pass default option directly without pre-formatting the query?

不,也不应该。相反,您应该在 helpers 命名空间中使用上述方法来生成正确的查询。它们更加强大和灵活 ;)