带有 Python(psycopg2) 的 PostgreSQL 中的通知不起作用
Notifications in PostgreSQL with Python(psycopg2) does not work
我想在 PostgreSQL 12 中的特定 table "FileInfos"
中有新条目时得到通知,所以我写了以下触发器:
create trigger trigger1
after insert or update on public."FileInfos"
for each row execute procedure notify_id_trigger();
和以下函数:
create or replace function notify_id_trigger()
returns trigger as $$
begin
perform pg_notify('new_Id'::text, NEW."Id"::text);
return new;
end;
$$ language plpgsql;
获取通知我使用 python 库 psycopg2:
import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
import select
def dblistener():
connection = psycopg2.connect(
host="127.0.0.1",
database="DBNAME",
user="postgres",
password="....")
connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cur = connection.cursor()
cur.execute("LISTEN new_Id;")
while True:
select.select([connection], [], [])
connection.poll()
while connection.notifies:
notify = connection.notifies.pop()
print("Got NOTIFY:", notify.pid, notify.channel, notify.payload)
if __name__ == '__main__':
dblistener()
但不幸的是我的 python 代码不起作用,我做错了什么?
顺便说一句:数据库和 table 是用 Entity Framework (C#) 创建的。
根据NOTIFY syntax,频道是一个标识符。这意味着 new_Id
在
LISTEN new_Id
自动转换为 new_id
。不幸的是,pg_notify('new_Id'::text, new."Id"::text)
在频道 new_Id
上通知。你有两个选择。在触发器中更改频道:
perform pg_notify('new_id'::text, new."Id"::text);
或在 LISTEN
:
中用双引号将频道括起来
LISTEN "new_Id"
在 Postgres 中使用大写字母可能会引起意外。
我想在 PostgreSQL 12 中的特定 table "FileInfos"
中有新条目时得到通知,所以我写了以下触发器:
create trigger trigger1
after insert or update on public."FileInfos"
for each row execute procedure notify_id_trigger();
和以下函数:
create or replace function notify_id_trigger()
returns trigger as $$
begin
perform pg_notify('new_Id'::text, NEW."Id"::text);
return new;
end;
$$ language plpgsql;
获取通知我使用 python 库 psycopg2:
import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
import select
def dblistener():
connection = psycopg2.connect(
host="127.0.0.1",
database="DBNAME",
user="postgres",
password="....")
connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cur = connection.cursor()
cur.execute("LISTEN new_Id;")
while True:
select.select([connection], [], [])
connection.poll()
while connection.notifies:
notify = connection.notifies.pop()
print("Got NOTIFY:", notify.pid, notify.channel, notify.payload)
if __name__ == '__main__':
dblistener()
但不幸的是我的 python 代码不起作用,我做错了什么? 顺便说一句:数据库和 table 是用 Entity Framework (C#) 创建的。
根据NOTIFY syntax,频道是一个标识符。这意味着 new_Id
在
LISTEN new_Id
自动转换为 new_id
。不幸的是,pg_notify('new_Id'::text, new."Id"::text)
在频道 new_Id
上通知。你有两个选择。在触发器中更改频道:
perform pg_notify('new_id'::text, new."Id"::text);
或在 LISTEN
:
LISTEN "new_Id"
在 Postgres 中使用大写字母可能会引起意外。