我想在PostgreSQL 12中,當一個特定的表"FileInfos"有一個新條目時被通知,所以我寫了以下觸發器:
create trigger trigger1
在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
執行pg_notify('new_Id'::text, NEW. "Id"::text) 。
return new;
end;
$$ language plpgsql;
為了獲得通知,我使用python庫psycopg2:
import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
輸入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;"/span>)
while True:
select.select([connection], [], [] )
connection.poll()
while connection.notifies:
notify = connection.notifies.pop()
print("Got NOTIFY:", notify.pid, notify.channel, notify.payload)
如果 __name__ == '__main__':
dblistener()
但不幸的是,我的Python代碼并沒有作業,我做錯了什么? BTW:資料庫和表是用Entity Framework(C#)創建的。
uj5u.com熱心網友回復:
根據NOTIFY語法,channel是一個識別符號。這意味著new_Id中
LISTEN new_Id
被自動轉換為new_id。不幸的是,pg_notify('new_Id'::text, new. "Id":text)在通道new_Id上發出通知。你有兩個選擇。改變觸發器中的通道:
執行pg_notify('new_id'::text, new."Id" /span>::text)。
或者在LISTEN中用雙引號將通道括起來:
LISTEN "new_Id"。
在Postgres中使用大寫字母可能會引起意外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/324742.html
標籤:
上一篇:在PostgresSQL表中添加布爾列以檢查條目是否為其屬性中的最新條目?
下一篇:使用IN條件和分組選擇行
