执行选择pg_notify的Python psycopg2不起作用

时间:2018-11-08 10:19:29

标签: 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 => {
        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脚本引发通知时,它不起作用。

经过两天的研究,我认为这是显而易见的和愚蠢的,但我看不到。也许这根本不可能...

请帮助。

1 个答案:

答案 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接收通知