我目前在 PostgreSQL 中有一個表,看起來像這樣
my_table (id, info, data, url)
這是通過網路爬蟲定期更新的,我附加了以下觸發器以通知我任何記錄的更新
cursor.execute("""
CREATE OR REPLACE FUNCTION notify_my_table_update() RETURNS TRIGGER AS $$
DECLARE
row RECORD;
output TEXT;
BEGIN
-- Checking the Operation Type
IF (TG_OP = 'DELETE') THEN
row = OLD;
ELSE
row = NEW;
END IF;
-- Forming the Output as notification. You can choose you own notification.
output = 'OPERATION = ' || TG_OP || ' and ID = ' || row.id;
-- Calling the pg_notify for my_table_update event with output as payload
PERFORM pg_notify('my_table_update',output);
-- Returning null because it is an after trigger.
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
""")
和
# CREATE TRIGGER trigger_my_table_update
# AFTER UPDATE
# ON my_table
# FOR EACH ROW
# EXECUTE PROCEDURE notify_my_table_update();
# -- We can not use TRUNCATE event in this trigger because it is not supported in case of FOR EACH ROW Trigger
# """
# )
每當更新資料庫時,這都會向我發送一個異步訊息。但是,我只希望它僅在列data 和 url發生任何更改時才通知我,即當前值正在更新為新值。無論抓取的值是否與資料庫中的值不同,我的 Web 抓取工具都會更新這些值。
我怎樣才能做到這一點?我在這里看到了 Richard Huxton 的回答,推薦 hstore。但是,我無法弄清楚如何為該表的每條記錄建立一個舊的 hstore 和一個新的 hstore。
如果這有什么不同,我正在將 Python 與 psycopg2 一起使用。
uj5u.com熱心網友回復:
它比你想象的要簡單:
IF OLD IS DISTINCT FROM NEW THEN
PERFORM pg_notify('my_table_update',output);
END IF;
使用IS DISTINCT FROM而不是<>正確處理 NULL 值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/334445.html
標籤:Python PostgreSQL psycopg2 商店
上一篇:如何遍歷表動態生成case陳述句
