这是我在StackOverflow上遇到的第一个问题,所以如果我做错了事,请保持柔和。
我正在努力从Python脚本执行SELECT pg_notify。看来这根本不起作用。
我的NodeJS服务器正在使用pg-promise监听“ testnotify”频道。我之所以这样说只是为了完整性,因为它可以正常工作。
db.connect({direct: true})
.then(sco => {
sco.client.on('notification', data => {
console.log('Received:', data);
});
return sco.none('LISTEN $1~', 'testnotify');
})
.catch(error => {
console.log('Error:', error);
});
在一系列成功的数据库操作之后,我的Python脚本应该发出通知。
我就是这样
conn = psycopg2.connect(conn_string)
cur = conn.cursor()
cur.execute("SELECT pg_notify('%s', '%s');" % ('testnotify', 'blabla'))
或类似的
query = "SELECT pg_notify('testnotify', 'blabla');"
print(query)
cur.execute(query)
我用NOTIFY testnotify进行了类似的尝试,“ blabla”没有任何效果。在NodeJS方面什么也没发生。 但是,当我从Python控制台复制print(query)的结果并直接从PostgreSQL执行它时,它的工作就像一个魅力。 我不明白我的代码有什么问题。
我正在Windows 10上使用psycopg2 2.7.5,PostgreSQL 10,Node 10 LTS和pg-promise。
侧面说明:这不是Node的问题,因为当在PostgreSQL的源表上使用触发器引发pg_notify或notify时,或者在db上作为常规sql查询执行通知时,Node才起作用。仅当我尝试从python脚本引发通知时,它不起作用。
经过两天的研究,我认为这是显而易见的和愚蠢的,但我看不到。也许这根本不可能...
请帮助。
答案 0 :(得分:0)
哦,我...我刚刚找到了解决方案...甚至有两种方法可以解决这个问题。
线索在psycopg文档中……很明显吧?
使用发送通知
cur.execute("SELECT pg_notify('%s', '%s');" % ('testnotify', 'blabla'))
必须将连接设置为自动提交
import psycopg2
import psycopg2.extensions
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
或者只是简单地,如果您不想自动提交,则在执行后
cur.execute("SELECT pg_notify('%s', '%s');" % ('testnotify', 'blabla'))
您必须提交
conn.commit()
aa并且现在Node正在通过python从postgresql接收通知