python & postgresql: надежная проверка наличия обновлений в определенной таблице



Ситуация: у меня есть живой торговый скрипт, который вычисляет все виды вещей каждые x минут в моем основном thread (Python ). отправка заказа осуществляется через такой thread. однако прием и исполнение таких приказов-это совсем другое дело, поскольку я не могу допустить, чтобы прошло x минут, но они мне нужны, как только они поступят. Я инициализировал другой thread, чтобы проверить наличие таких данных (выполнение), которые находятся в таблице базы данных (POSTGRES SQL).



Проблема(ы): я не могу непрерывно выполняйте запрос каждые xx МС, получайте данные из БД, сравнивайте длину таблицы, а затем получайте разницу по разным причинам (не только из-за необходимости использовать такую БД, проблем с перфорацией и т. д.). поэтому я поискал некоторые решения и пришел к этой теме (https://dba.stackexchange.com/questions/58214/getting-last-modification-date-of-a-postgresql-database-table) где в основном суть была в том, что
" нет достоверной, авторской записи последнего измененного времени a стол".



Вопрос: что я могу сделать с этим, то есть: приблизиться к мгновенным ответам из таблицы postgres sql, не перегружая все это с помощью Python?

825   1  

1 ответ:

Вы можете использовать уведомления в postgresql:

import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT

def dblisten(dsn):
    connection = psycopg2.connect(dsn)
    connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
    cur = connection.cursor()
    cur.execute("LISTEN new_id;")
    while True:
        select.select([connection],[],[])
        connection.poll()
        events = []
        while connection.notifies:
            notify = connection.notifies.pop().payload
            do_something(notify)

И установите триггер для каждого обновления:

CREATE OR REPLACE FUNCTION notify_id_trigger() RETURNS trigger AS $$
BEGIN
  PERFORM pg_notify('new_id', NEW.ID);
  RETURN new;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER data_modified AFTER insert or update on data_table for each row execute procedure notify_id_trigger();")

Comments

    Ничего не найдено.