python & postgresql:可靠地检查特定 table 中的更新
python & postgresql: reliably check for updates in a specific table
情况: 我有一个实时交易脚本,它在我的主 thread
(Python)。订单发送是通过这样的thread
进行的。这些订单的接收和执行虽然是另一回事,因为我不能让 x 分钟过去,但它们一进来我就需要它们。我初始化了另一个 thread
来检查这样的数据(执行)数据库 table (POSTGRES SQL
)。
问题: 我无法连续每 xx 毫秒执行一次查询,从数据库中获取数据,比较 table 长度,然后获取各种差异原因(不仅是使用此类数据库的人,性能问题等)。所以我查找了一些解决方案并想出了这个线程(https://dba.stackexchange.com/questions/58214/getting-last-modification-date-of-a-postgresql-database-table),基本上它的要点是
"There is no reliable, authorative record of the last modified time of a table".
问题: 我能做些什么,即:从 postgres sql
table 获得接近即时的响应,而不会使用 Python
?
您可以在 postgresql 中使用通知:
import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
import select
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();")
情况: 我有一个实时交易脚本,它在我的主 thread
(Python)。订单发送是通过这样的thread
进行的。这些订单的接收和执行虽然是另一回事,因为我不能让 x 分钟过去,但它们一进来我就需要它们。我初始化了另一个 thread
来检查这样的数据(执行)数据库 table (POSTGRES SQL
)。
问题: 我无法连续每 xx 毫秒执行一次查询,从数据库中获取数据,比较 table 长度,然后获取各种差异原因(不仅是使用此类数据库的人,性能问题等)。所以我查找了一些解决方案并想出了这个线程(https://dba.stackexchange.com/questions/58214/getting-last-modification-date-of-a-postgresql-database-table),基本上它的要点是 "There is no reliable, authorative record of the last modified time of a table".
问题: 我能做些什么,即:从 postgres sql
table 获得接近即时的响应,而不会使用 Python
?
您可以在 postgresql 中使用通知:
import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
import select
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();")