pg-promise helpers:插入和多次更新中的可选字段

时间:2019-07-18 16:16:19

标签: node.js helper pg-promise

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

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

插入声明

使用此post,我定义了一个ColumnSet,其中包含可选字段(stypesspeeddisup)。它可行,但我只想知道一些细节: 您可以看到ColumnSetstate的值定义为“ false”(如果对象没有该属性)。 在数据库中,默认情况下将字段“ disup”定义为“ false”,所以我真的需要在此处将值定义为false还是有其他方法来定义可选列吗? 假设我ALTER TABLE将默认值更改为TRUE,那么我将不得不更改代码。 skip参数不适用于插入,我不知道如何使用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不适用于数组,如何使“多次更新”查询与“可选”字段一起使用?答案是“任务还是批处理”? (我不太了解批处理的内容) 例如使用

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

谢谢!

1 个答案:

答案 0 :(得分:0)

  

在数据库中,字段disup默认定义为false,所以我真的需要在此处将值定义为false还是有其他方法来定义可选列?

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

  

如何使“多个更新”查询与“可选”字段一起使用?

不可能。 PostgreSQL用于多行更新的语法不允许这种情况。 in documentation-skip逻辑仅适用于单行更新。对于多行更新,您将必须在其中提供默认值,例如definit

还要注意,您正在对原始类型使用过时的_rawType属性。不久前它已更改为rawType。还是您正在使用图书馆的古老版本?那也不是很好,您应该升级。并且所有在线文档均指最新版本。

它对您有用的原因是因为def: { rawType: true, toPostgres: () => false }可以简化为def: false。除非您的函数返回预格式化的文本,否则您无需使用原始文本。

额外

如果INSERTUPDATE的{​​{3}}对象非常相似,则可以使用方法ColumnSetextend减少重新声明。 )