【问题标题】:append integer to an array (using express and pg-promise)将整数附加到数组(使用 express 和 pg-promise)
【发布时间】:2019-09-23 04:38:22
【问题描述】:

我正在使用 PostgreSQL 文档中的 array_append 函数,但看不到我做错了什么,但出现以下错误:

error:  { error: invalid input syntax for integer: "{22}"

这里是查询:

UPDATE epics 
   SET collection_ids = array_append(collection_ids, '{${id}}') 
WHERE id = ${epicId}

这是表格的代码:

CREATE TABLE epics (
  id SERIAL PRIMARY KEY,
  title varchar,
  collection_ids SMALLINT[]
);

【问题讨论】:

  • 问题是我有括号。它适用于:'${id}'
  • 如果你通过pg-promise使用它,你的代码可能是错误的。您应该包括查询执行部分/方法。
  • 根据文档,它需要一个值。那么为什么要引用它呢?不应该只是array_append(collection_ids, ${id})吗?

标签: arrays postgresql pg-promise


【解决方案1】:

根据@abelisto 的评论,这是最好的解决方案:

UPDATE epics SET collection_ids = collection_ids || ${id}::SMALLINT
WHERE id = ${epicId}

它更优雅,因为它是 SQL 原生的,没有类型歧义,甚至支持数组,如果需要的话(下面我们假设 ${id} 作为数组传入):

UPDATE epics SET collection_ids = collection_ids || ${id}::SMALLINT[]
WHERE id = ${epicId}

因为在pg-promise中,1,2,3的数组会自动格式化为array[1,2,3]

【讨论】:

    【解决方案2】:

    UPDATE epics SET collection_ids = array_append(collection_ids, '${id}') WHERE id = ${epicId}

    工作。

    【讨论】:

    • 您自己的回答又无效了。服务器将通过重新转换为整数来理解它,但没有理由像您那样将其包装成引号。此外,将来,如果您找到自己问题的解决方案,请选择删除您的问题或给其他人时间查看和回答。但立即回答自己的问题通常不是一个好主意,尤其是给出错误的解决方案。
    • 更好的解决方案是array_append(collection_ids, ${id}::SMALLINT)。这样一来,您传入的内容与实际预期的内容之间就没有歧义。否则,如果你传入一个字符串而不是数字,例如,结果将被破坏。
    • @vitaly-t collection_ids || ${id}?
    • @Abelisto 这似乎更好(更优雅),它支持传入一个数组,而不仅仅是一个值。
    • 知道了,谢谢!将其他答案标记为解决方案!
    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2017-01-03
    • 2016-07-01
    • 2016-09-13
    • 2015-11-23
    相关资源
    最近更新 更多