蟒蛇& postgresql:可靠地检查特定表中的更新

时间:2017-01-14 10:25:11

标签: python multithreading postgresql auto-update

情况:我有一个实时交易脚本,可以在我的主thread Python )中每隔x分钟计算各种内容。订单发送通过此类thread执行。接收和执行这些命令虽然是另一回事,因为我不能允许x分钟通过但是我们一进来就需要它们。我初始化了另一个thread来检查这样的数据(执行)数据库表(POSTGRES SQL)。

问题:我不能每xx ms连续执行查询,从DB获取数据,比较表长度,然后出于各种原因获取差异(不仅仅是使用这样的人) DB,性能问题等)。所以我查找了一些解决方案并想出了这个帖子(https://dba.stackexchange.com/questions/58214/getting-last-modification-date-of-a-postgresql-database-table),其中基本上就是它的主旨 "表格的最后修改时间没有可靠的,有效的记录"。

问题我该怎么办呢,就是:从postgres sql表接近不稳定的响应而不使用Python重载整个事件?

1 个答案:

答案 0 :(得分:3)

您可以在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();")