繁体   English   中英

PostgreSQL:更新特定列时通知

[英]PostgreSQL: NOTIFY when specific column is updated

我目前在 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 一起使用。

它比你想象的要简单:

IF OLD IS DISTINCT FROM NEW THEN
   PERFORM pg_notify('my_table_update',output);
END IF;

使用IS DISTINCT FROM而不是<>来正确处理 NULL 值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM