Python 3.x Python psycopg2执行select pg_notify无法工作
这是我在StackOverflow的第一个问题,所以如果我做错了什么,请温柔一点 我正在努力从Python脚本执行SELECT pg_notify。似乎根本不起作用 我的NodeJS服务器正在使用pg promise监听“testnotify”频道。我把它放在这里只是为了完整性,因为它正在工作Python 3.x Python psycopg2执行select pg_notify无法工作,python-3.x,psycopg2,postgresql-10,Python 3.x,Psycopg2,Postgresql 10,这是我在StackOverflow的第一个问题,所以如果我做错了什么,请温柔一点 我正在努力从Python脚本执行SELECT pg_notify。似乎根本不起作用 我的NodeJS服务器正在使用pg promise监听“testnotify”频道。我把它放在这里只是为了完整性,因为它正在工作 db.connect({direct: true}) .then(sco => { sco.client.on('notification', data => { co
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脚本应该在一系列成功的db操作之后发出通知
我是这样做的
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)
import psycopg2
import psycopg2.extensions
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
还是那样
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)
import psycopg2
import psycopg2.extensions
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
我用类似的方式尝试了NOTIFY testnotify,'blablabla',但没有任何效果。NodeJS那边什么也没发生。
但当我从Python控制台复制printquery的结果并直接从PostgreSQL执行它时,它就像一个魔咒一样工作。
我不明白我的代码出了什么问题
我在Windows10上使用的是PsycopG22.7.5、PostgreSQL10、Node10LTS和PGPromise
旁注:这不是节点的问题,因为在postgresql的源表中使用触发器引发pg_notify或notify时,或者在db中作为常规sql查询执行通知时,节点工作。它不仅在我试图从python脚本发出通知时起作用
经过两天的努力,我认为这是一件明显而愚蠢的事情,但我看不出来。也许这是不可能的
请帮忙。哦,天哪。。。我刚找到解决办法。。。甚至有两种方法可以解决这个问题 线索在psycopg文档中。。。很明显吧 使用发送通知
cur.execute("SELECT pg_notify('%s', '%s');" % ('testnotify', 'blabla'))
必须像这样设置自动提交的连接
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)
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现在节点通过python接收来自postgresql的通知