pg-promise助手:插入和多次更新中的可选字段
我对插入和更新语句的非必需字段有疑问
使用此post,我定义了一个ColumnSet
,其中包含可选字段(stype
,sspeed
,disup
)。它可行,但我只想知道一些细节:
您可以看到ColumnSet
将state
的值定义为“ 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
谢谢!
答案 0 :(得分:0)
在数据库中,字段
disup
默认定义为false
,所以我真的需要在此处将值定义为false
还是有其他方法来定义可选列?
这取决于您要实现的目标。例如,如果您想在缺少属性时使用false
,则可以使用skip: col => !col.exists
代替def: false
。
如何使“多个更新”查询与“可选”字段一起使用?
不可能。 PostgreSQL用于多行更新的语法不允许这种情况。 in documentation-skip
逻辑仅适用于单行更新。对于多行更新,您将必须在其中提供默认值,例如def
或init
。
还要注意,您正在对原始类型使用过时的_rawType
属性。不久前它已更改为rawType
。还是您正在使用图书馆的古老版本?那也不是很好,您应该升级。并且所有在线文档均指最新版本。
它对您有用的原因是因为def: { rawType: true, toPostgres: () => false }
可以简化为def: false
。除非您的函数返回预格式化的文本,否则您无需使用原始文本。
额外
如果INSERT
和UPDATE
的{{3}}对象非常相似,则可以使用方法ColumnSet和extend减少重新声明。 )