使用Python psycopg2接收PostgreSQL表变更通知失效如何解决
问题排查及解决方案
1. 最常见原因:通知通道名大小写不匹配
PostgreSQL有如下规则:
- 未用双引号包裹的标识符(比如你Python代码里
LISTEN new_Id;里的new_Id)会被自动转为全小写,实际监听的通道是new_id pg_notify的第一个参数是文本字符串,大小写会原样保留,你代码里写的是'new_Id',实际发送的通道是new_Id
两者通道名不一致,自然收不到通知。
修复方法二选一:
- 统一全小写:将触发函数里的
pg_notify('new_Id'::text, NEW."Id"::text)改为pg_notify('new_id'::text, NEW."Id"::text),同时Python代码的监听语句改为cur.execute("LISTEN new_id;") - 保留大小写一致:Python代码的监听语句加上双引号包裹通道名,改为
cur.execute('LISTEN "new_Id";')
2. 数据库端触发器未正常触发
你用Entity Framework创建的表,需要确认两个点:
- 触发器绑定的
public."FileInfos"是你实际插入/更新数据的表,确认EF没有把表创建到其他schema下,或者表名大小写和实际不符 - 手动验证触发器有效性:打开两个psql会话,第一个会话执行
LISTEN "new_Id";,第二个会话手动执行一条INSERT语句插入public."FileInfos"表,查看第一个会话是否能收到通知,如果收不到则是触发器/触发函数的配置错误。
3. 插入端事务未提交
PostgreSQL的通知只会在事务成功提交后发送,如果你C#的EF代码在插入/更新数据后没有调用SaveChanges()提交事务,或者事务触发了回滚,通知不会被发送。
4. 连接配置错误
确认Python代码里的数据库连接参数(数据库名、账号密码、地址)和你EF使用的数据库完全一致,没有连错环境。
内容的提问来源于stack exchange,提问作者ChsharpNewbie
相关产品推荐
相关产品推荐

