【问题标题】:Skip update columns that were not passed in the source跳过未在源中传递的更新列
【发布时间】:2019-10-12 00:00:06
【问题描述】:

列名的字符串或helpers.sets 接口中是否有任何语法可以跳过数据源中不存在的属性的列?

现在,我需要将 ColumnConfig 创建为 new helpers.Column({ name, skip: c => !c.exists }) 对于每一个可能的列。

如果有类似的东西就好了:

pgp.helpers.sets(values, SomeRepository.cs.update, skipNonExisting);

或至少:

pgp.helpers.ColumnSet(['column1*', 'column2*']);

其中 *(或任何其他方便的符号)表示该列在源中是可选的,它不会抛出 "Property 'name' doesn't exist."

helpers.sets 需要这个(update 不需要,因为我有一些重要的更新 SQL)。

如文档所述 (http://vitaly-t.github.io/pg-promise/helpers.html#.sets),当未指定集合中的列参数时,将使用数据对象的属性。

在我需要对某些列进行特殊格式设置之前,它可以正常工作,然后设置仅适用于 ColumnsSets 中已定义的列(如果指定)。

【问题讨论】:

  • That works fine until I need special formatting for some column, and then sets works only for defined columns in ColumnsSets if specified. 我不确定这里有什么问题。添加示例会有所帮助。

标签: pg-promise


【解决方案1】:

在现代 JavaScript 中,你可以很容易地用一行来缩写……

因此将列名列表转换为可选列列表:

const cndCols = arr => arr.map(name => ({name, skip: c => !c.exists}));

声明ColumnSet对象:

const cs = pgp.helpers.ColumnSet(cndCols(['column1', 'column2']));

它并不比问题中建议的解决方案复杂。

helpers.sets 需要这个(不是更新,因为我有一些重要的更新 SQL)。

为此,您创建并使用两个单独的 ColumnSet 对象。

【讨论】:

  • 好的,和我的第二个建议差不多。但是第一个建议是最简单的: pgp.helpers.sets(values, SomeRepository.cs.update, skipNonExisting);根本不需要列出所有列。好的,可以从源中检索键,然后过滤列集。
  • @TihomirMagdic 列名作为字符串已经支持?name 用于条件列,添加* 用于不同的条件检查会造成混乱。
  • 带前缀的列?在 SET 中被忽略,所以这在这种情况下没有帮助。
  • @TihomirMagdic 我不关注。你需要澄清最后的陈述。
  • @TihomirMagdic 你之前误解了我的意思。我说我们在字符串格式中已经有了一个条件符号,为其他东西添加另一个条件符号会造成混乱。无论如何,我提供的解决方案就是您所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多