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

时间:2016-10-22 17:59:20

标签: javascript pg-promise

我需要使用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})

1 个答案:

答案 0 :(得分:3)

我是pg-promise的作者。

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

在内部,查询引擎确实支持高级查询格式选项,方法as.format,例如partialdefault。并且库中有几个对象可以使用这些选项。

您应该用于生成插入的一个特别是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命名空间中使用上述方法来生成正确的查询。它们更强大,更灵活;)