Postgred pg_notify / listen仅在通道名称为小写时才起作用

时间:2017-05-26 10:00:33

标签: node.js postgresql notify pg-notify

我已阅读https://www.postgresql.org/docs/9.6/static/sql-notify.html,频道名称仅被描述为“标识符”。

我正在使用NodeJS和pg https://www.npmjs.com/package/pg来访问postgres。

如果我在两者中使用小写字词,例如pg_notify('foo', ...LISTEN foo可行。我测试了所有组合:

pg_notify  LISTEN  outcome
lower      lower   works
lower      upper   works
upper      lower   fails
upper      upper   fails

这是一个错误,还是作为'标识符'的逻辑结果? (如果是这样,是否应该在pg_notify页面上记录?)

2 个答案:

答案 0 :(得分:4)

混淆来自引号。 单引号用于字符串,double用于标识符,如果不使用混合大小写/从数字/或其他技巧开始,则可以跳转到无。

运行pg_notify函数时,将'foo'作为字符串参数传递,因此使用单引号,当您运行NOTIFY "Virtual"时,使用Virtual作为通道名称 - 标识符,所以你需要在这里使用"

所以,当你回答自己,改变

client.query("LISTEN 'Virtual'"); 

client.query('LISTEN "Virtual"');

解决了问题

https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

答案 1 :(得分:3)

您应该查找标识符定义:Identifiers and Key Words

在这种意义上,不带引号的标识符不区分大小写,无论用户如何编写它们,Postgres都会将它们视为小写。在函数pg_notify()中,第一个参数是不是一个标识符,而是一个文本文字,在没有解析的情况下被视为标识符,因此它不会转换为小写。