2017-01-14 4 views
2

Situation: J'ai un script de trading en direct qui calcule toutes sortes de choses toutes les x minutes dans mon principal thread (Python). l'envoi de la commande est effectué par l'intermédiaire de thread. la réception et l'exécution de ces commandes est cependant différente car je ne peux pas laisser passer x minutes mais j'en ai besoin dès qu'elles arrivent. J'ai initialisé une autre thread pour vérifier les données (exécution) qui se trouvent dans une table de base de données (POSTGRES SQL).python et postgresql: vérifier de manière fiable des mises à jour dans un tableau spécifique

Problème (s): Je ne peux pas continuosly exécuter la requête tous les xx ms, obtenir des données de DB, comparer la longueur de la table, puis obtenir la différence pour diverses raisons (de type non seulement d'utiliser ce DB, perforamnce questions , etc). donc j'ai recherché quelques solutions et suis venu avec ce fil (https://dba.stackexchange.com/questions/58214/getting-last-modification-date-of-a-postgresql-database-table) où fondamentalement l'essentiel était que "Il n'y a aucun enregistrement fiable et autoritaire de la dernière heure modifiée d'une table".

Question: Que puis-je faire à ce sujet, qui est la suivante: obtenir des réponses à instantenuous d'une table postgres sql sans surcharger le tout en utilisant Python?

Répondre

3

Vous pouvez utiliser les notifications dans 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) 

et installer un déclencheur pour chaque mise à jour:

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();") 
+0

c'est tellement hors de ma ligue! Je vais essayer tout de suite – Asher11