使用 pg-promise 转换值时出现奇怪的错误

Strange error when casting values using pg-promise

我正在尝试使用 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 之前该查询一直有效,因此我将其缩减为仅该查询:

`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 运行 这个查询?

事实证明我在查询中包含无效字符,这导致了非常奇怪的输出,例如:

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 扩展,发现查询中实际上存在无效字符:

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