PostgreSQL:更新特定列时通知
PostgreSQL: NOTIFY when specific column is updated
我目前在 PostgreSQL 中有一个 table 看起来像这样
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 列中有任何 change 时通知我,即当前值正在更新为新值。我的网络抓取器更新这些值,无论抓取的值是否与数据库中的值不同。
我怎样才能做到这一点?我看到 Richard Huxton 的 answer here 推荐 hstore。但是,我无法弄清楚如何为这个 table.
的每条记录建立一个旧的 hstore 和一个新的 hstore
如果有任何不同,我将 Python 与 psycopg2 一起使用。
比你想象的要简单:
IF OLD IS DISTINCT FROM NEW THEN
PERFORM pg_notify('my_table_update',output);
END IF;
使用 IS DISTINCT FROM
而不是 <>
来正确处理 NULL 值。
我目前在 PostgreSQL 中有一个 table 看起来像这样
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 列中有任何 change 时通知我,即当前值正在更新为新值。我的网络抓取器更新这些值,无论抓取的值是否与数据库中的值不同。
我怎样才能做到这一点?我看到 Richard Huxton 的 answer here 推荐 hstore。但是,我无法弄清楚如何为这个 table.
的每条记录建立一个旧的 hstore 和一个新的 hstore如果有任何不同,我将 Python 与 psycopg2 一起使用。
比你想象的要简单:
IF OLD IS DISTINCT FROM NEW THEN
PERFORM pg_notify('my_table_update',output);
END IF;
使用 IS DISTINCT FROM
而不是 <>
来正确处理 NULL 值。