【问题标题】:'default' option in pgp.as.format()pgp.as.format() 中的“默认”选项
【发布时间】:2016-10-25 16:39:30
【问题描述】:

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

【问题讨论】:

    标签: javascript pg-promise


    【解决方案1】:

    我是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 命名空间中的上述方法来生成正确的查询。它们更强大、更灵活;)

    【讨论】:

    • 谢谢你这么详细的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多