我尝试在 python 中接收两个通知,其中一个有效(“LISTEN raw_data_insert;”),另一个(“LISTEN device_snapshot_change;”)无效。
触发器确实会在更新时触发,并调用通知函数;我可以看到这个输出
[00000] 收到更新“{”测试“:1,“某事”:4}“
显示更新后的json字段,但pg_notify似乎没有发送到python客户端?
我可以删除cursor.execute(f"LISTEN raw_data_insert;")行,它不会改变任何东西,拥有这两行不会改变任何东西。目前只有 raw_data_insert 正在工作。 我不确定问题是什么,有什么想法吗?谢谢
蟒蛇:
import asyncio
import psycopg2
conn = # custom service to build connection
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
cursor = conn.cursor()
cursor.execute(f"LISTEN raw_data_insert;")
cursor.execute(f"LISTEN device_snapshot_change;")
def do_notify():
conn.poll()
for notify in conn.notifies:
print(f"NOTIFICATION RECEIVED {notify.channel}")
if notify.channel == 'raw_data_insert':
print(notify.payload)
print("=====")
elif notify.channel == 'device_snapshot_change':
print(notify.payload)
print("=====")
conn.notifies.clear()
loop = asyncio.get_event_loop()
loop.add_reader(conn, do_notify)
loop.run_forever()
sql:
CREATE OR REPLACE FUNCTION notify_device_snapshot_change()
RETURNS trigger AS $$
BEGIN
RAISE NOTICE 'UPDATE RECEIVED "%"', NEW.device_snapshot;
PERFORM pg_notify(
'device_snapshot_change',
NEW.device_snapshot::text
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER device_snapshot_change
AFTER UPDATE OF device_snapshot ON device
FOR EACH ROW
EXECUTE PROCEDURE notify_device_snapshot_change();
几天后,我在另一个不存在触发器和函数的临时数据库实例上修复了我的问题。当我创建表并运行上面的脚本时,它第一次工作,所以我放弃并假设另一个实例存在一些问题/拼写错误。
感谢您抽出时间。