Python psycopg2 执行选择pg_notify不起作用



这是我在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控制台复制打印(查询(的结果并直接从PostgreSQL执行它时,它就像一个魅力。我不明白我的代码出了什么问题。

我在Windows 10上使用psycopg2 2.7.5、PostgreSQL 10、Node 10 LTS、pg promise。

附带说明:这对Node来说不是问题,因为当在postgresql中的源表中使用触发器引发pg_notify或notify时,或者当在db中作为常规sql查询执行通知时,它正在工作。只有当我试图从python脚本中发出通知时,它才不起作用。

经过两天的努力,我认为这是一件显而易见的愚蠢的事情,但我看不出来。或者这是不可能的。。。

请帮忙。

天哪…我刚刚找到解决方案。。。甚至有两种方法可以解决这个问题。

线索在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()

aaand now节点正在通过python 接收来自postgresql的通知

最新更新