【问题标题】:Strange error when casting values using pg-promise使用 pg-promise 转换值时出现奇怪的错误
【发布时间】:2019-09-26 19:21:45
【问题描述】:

我正在尝试使用 pg-promise 版本 9.2.1 执行此查询,并与 Postgres 9.5 通信

以下所有查询在我通过 psql CLI 或 Postico 运行时都有效,但在我从 pg-promise 运行时则无效。

我从这个查询开始(我知道,对字段使用 pg 关键字是不好的,但它是遗留的):

await db.many(
`SELECT * FROM "${schemaName}".versions
  UNION
  SELECT * FROM "${schemaName}".z_transfer_metadata
  UNION
  SELECT 'version' AS key, "version"::varchar AS value FROM "${schemaName}".modules WHERE parent_id IS NULL`)

我会从节点收到这个错误:

error: syntax error at or near "      SELECT"
 at Connection.parseE (/app/node_modules/pg/lib/connection.js:604:11)
 at Connection.parseMessage (/app/node_modules/pg/lib/connection.js:401:19)

这来自 PG:

ERROR:  UNION types character varying and bigint cannot be matched at character 133
STATEMENT:  SELECT * FROM "the_schema".versions 
           UNION 
           SELECT * FROM "the_schema".z_transfer_metadata
           UNION
           SELECT "version" as key, version::varchar as value FROM "the_schema".modules WHERE parent_id IS NULL

在我添加第三个联合选择之前,该查询正在运行,因此我将其缩减为仅该查询:

`SELECT 'version' AS key, "version"::varchar AS value FROM "${schemaName}".modules WHERE parent_id IS NULL`

但是PG给了我这个错误:

ERROR:  syntax error at or near "::" at character 35
STATEMENT:  SELECT 'version' AS key, "version"::varchar AS value FROM "the_schema".modules WHERE parent_id IS NULL

我尝试了多种变体,包括使用CAST 和转义'version' 周围的引号,并且大多数转义变体都是本机工作的,只是不是通过pg-promise。

ERROR:  syntax error at or near "AS" at character 41
STATEMENT:  SELECT 'version' AS key, CAST("version" AS TEXT) AS value FROM "the_schema".modules WHERE parent_id IS NULL

如何从 pg-promise 运行此查询?

【问题讨论】:

  • pg-promise 执行这些都没有问题。您手动注入字符串而不是格式化,这可能会把事情搞砸。不要使用模板字符串,使用变量来进行正确的值格式化,如explained in documentation
  • 是的,我也尝试过其他变体,当我运行这样的东西时,我仍然遇到同样的错误:db.many(`SELECT 'version' AS key, "version"::TEXT AS value FROM "$(schemaName:raw)".modules WHERE parent_id IS NULL`, { schemaName })
  • 你不应该使用"$(schemaName:raw)"之类的东西,而是使用$(schemaName:name)。除此之外,我试图重现该问题,但没有成功。您正在使用的东西未包含在此处。
  • 我已经初始化了camelize函数,没有造成任何问题,但是我删除了它,所以'receive'钩子没有任何东西,甚至删除了'error'钩子中的逻辑。当我运行此查询时,双引号出现语法错误:db.manyOrNone(`SELECT 'version' AS key, version::TEXT AS value FROM $(schemaName:name).modules WHERE parent_id IS NULL`, { schemaName })ERROR: syntax error at or near ""anf-d2720-a0"" at character 54 STATEMENT: SELECT 'version' AS key, version::TEXT AS value FROM "the_schema".modules WHERE parent_id IS NULL
  • 当然,如果我使用:raw 过滤器来避免使用双引号,那么架构名称中的- 就会出现语法错误...

标签: postgresql postgresql-9.5 pg-promise


【解决方案1】:

原来我的查询中有无效字符,这导致了非常奇怪的输出,例如:

23:17:31 error: relation "schema-d123.modules where parent_id is null" does not exist 
query: SELECT version FROM "schema-d123".modules WHERE parent_id IS NULL

(请注意,尽管查询显示正确,但由于某种原因,关系名称中包含 where 子句)

事实证明我在查询中有不间断的空格,我发现我的光标在查询中按单词移动(VSCode 中的选项 + 左/右)。我安装了Gremlins扩展,发现查询中其实有无效字符:

我重新输入查询后,一切都按预期工作。

【讨论】:

  • VSCode 有多好? :) 我做我所有的项目,包括pg-promise in WebStorm ;)
  • 我也喜欢 IntelliJ 产品,但我发现 VS 代码中的 Javascript 项目不那么繁琐。另外还有这么多插件
猜你喜欢
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2020-08-30
  • 2013-05-05
  • 2018-09-20
  • 2012-05-05
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多