使用 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 扩展,发现查询中实际上存在无效字符:
我重新输入查询后,一切都按预期进行。
我正在尝试使用 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 扩展,发现查询中实际上存在无效字符:
我重新输入查询后,一切都按预期进行。