pg-promise 助手:插入和多重更新中的可选字段

pg-promise helpers : optionnal fields in insert and multiple-update

pg-promise 助手:插入和多重更新中的可选字段

我对插入和更新语句的非必填字段有一些疑问

插入语句

我用这个 定义了一个包含可选字段(stypesspeeddisup)的 ColumnSet。它有效,但我只想知道一些细节: 如果对象没有 属性,您可以看到 ColumnSetstate 的值定义为 "false"。 在数据库中,字段 "disup" 默认定义为 "false",所以我真的需要在这里将值定义为 false 还是有其他方法来定义可选列? 想象一下,我 ALTER TABLE 将默认值更改为 TRUE 我将不得不更改代码。 skip parameter don't works with insert I don't understand how to use partial(我想我不能在这里使用它)

cs.insert = new pgp.helpers.ColumnSet([
    /* hidden for brevity */
    { name: 'stype', prop: 'type', def:  { _rawType: true, toPostgres: () => null } },
    { name: 'sspeed', prop: 'speed', def:  { _rawType: true, toPostgres: () => null } },
    { name: 'disup', prop: 'state', def:  { _rawType: true, toPostgres: () => false } }
  ], {
    table: 'interfaces'
});

const objInsert = [
  { /* hidden for brevity */, state: false },
  { /* hidden for brevity */, speed: 2000, type: "Wired" }
];

pgp.helpers.insert(objInsert, cs.insert);

更新声明

我需要在另一个 ColumnSet 中定义可选列,但这次对于 UPDATE 语句,我想使用数组作为输入。 skip 不适用于数组,如何使 "multiple update" 查询适用于 "optional" 字段?答案是 "with a task or a batch" 吗? (我真的不明白批处理是做什么的) 例如使用

cs.update = new pgp.helpers.ColumnSet([
    { name: 'interfaceid', prop: 'id', cnd: true },                          
    { name: 'updatedat', mod:'^', init: () => 'CURRENT_TIMESTAMP(0)' },                     
    { name: 'siface', prop: 'iface', skip: col => !col.exists },
    { name: 'sipv4', prop: 'ipv4', cast: 'inet', skip: col => !col.exists },
    { name: 'sipv6', prop: 'ipv6', cast: 'inet', skip: col => !col.exists },
    { name: 'smac', prop: 'mac', cast: 'macaddr', skip: col => !col.exists },
    { name: 'stype', prop: 'type', skip: col => !col.exists },
    { name: 'sspeed', prop: 'speed', skip: col => !col.exists },
    { name: 'disup', prop: 'state', skip: col => !col.exists }
  ], {
    table: 'interfaces'
});

const objs =  [
    { id: 1, iface: "new value", state: false   },
    { id: 37, ipv4: "192.168.254.1" }
];

pgp.helpers.update(objs, cs.update); // throw "Property 'ipv4' doesn't exist." because objs is an array

提前致谢!

In the database the field disup is defined to false as default, so do I really need to define here the value as false or is there an other way to define optional columns?

这取决于您要实现的目标。例如,如果您想在缺少 属性 时使用 false,则可以使用 def: false.

而不是 skip: col => !col.exists

how to make "multiple update" query works with "optional" fields?

这是不可能的。 multi-row 更新的 PostgreSQL 语法不允许这样的事情。 in documentation - skip 逻辑仅适用于 single-row 更新。对于 multi-row 更新,您必须在那里提供默认值,如 definit.

另请注意,您正在为原始类型使用 long-obsolete _rawType 属性。前段时间改成了rawType。还是您使用的是图书馆的旧版本?那也不好,你应该升级。所有在线文档均参考最新版本。

它对你有用的原因是因为 def: { rawType: true, toPostgres: () => false } 可以减少到 def: false。您不需要使用原始文本,除非您的函数 returns pre-formatted text.

额外

如果你的 ColumnSet objects for INSERT and UPDATE are very similar, you can reduce the re-declaration, by using methods extend and merge ;)