PostgreSQL: NOTIFY指定的列被更新



我目前在PostgreSQL中有一个表,看起来像这样

my_table (id, info, data, url)

这是一个webscraper定期更新,我附加了以下触发器通知我更新到任何记录

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 scraper更新这些值,无论刮取的值是否与数据库中的值不同。

我怎样才能做到这一点?我在这里看到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值。