【发布时间】: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