pg-promise 助手:插入和多重更新中的可选字段
pg-promise helpers : optionnal fields in insert and multiple-update
pg-promise 助手:插入和多重更新中的可选字段
我对插入和更新语句的非必填字段有一些疑问
插入语句
我用这个 定义了一个包含可选字段(stype
、sspeed
、disup
)的 ColumnSet
。它有效,但我只想知道一些细节:
如果对象没有 属性,您可以看到 ColumnSet
将 state
的值定义为 "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 更新,您必须在那里提供默认值,如 def
或 init
.
另请注意,您正在为原始类型使用 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 ;)
pg-promise 助手:插入和多重更新中的可选字段
我对插入和更新语句的非必填字段有一些疑问
插入语句
我用这个 stype
、sspeed
、disup
)的 ColumnSet
。它有效,但我只想知道一些细节:
如果对象没有 属性,您可以看到 ColumnSet
将 state
的值定义为 "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 tofalse
as default, so do I really need to define here the value asfalse
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 更新,您必须在那里提供默认值,如 def
或 init
.
另请注意,您正在为原始类型使用 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 ;)