Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 22/02/2019 00:57:03
- jb2019
- Membre
SELECT suivi de LISTEN
Bonjour à tous,
j'aimerai pouvoir faire avec postgresql (interrogée depuis un code Python) l'équivalent de la fonctionnalités "changes" de CouchDB.
Pour être plus précis: je stocke des événements avec un timestamp, je fais uniquement des INSERT dans cette table, j'aimerai pouvoir interroger Postgresql
en disant: "retourne moi tous les événements depuis la date t, puis une fois que tu es arrivée en fin de table, écoute les nouveaux INSERT et continue à boucler infiniment".
Aujourd'hui j'ai résolu ce problème en 2 étapes: je fais une requête (à un instant t0) pour avoir tous les événements depuis l'instant t (< t0), je boucle sur ces lignes,
durant cette boucle de nouveaux événements peuvent avoir été ajoutés, du coup je refais (à un instant t1 > t0) la même requête entre t0 et t1, etc... jusqu'à ce que
cette requête retourne 0 résultats... ensuite je commence à "écouter" les nouveaux INSERT avec une requête LISTEN et j'ai un TRIGGER qui me "pousse" les nouvelles lignes (code python asynchrone via aiopg).
Cette méthode fonctionne sous une charge raisonnable, j'aimerai savoir si il y a quelque chose de plus propre !
Merci par avance !
Hors ligne
#2 22/02/2019 01:39:18
- gleu
- Administrateur
Re : SELECT suivi de LISTEN
Si je comprends bien, le trigger sur INSERT fait des NOTIFY, et le LISTEN vous permet de savoir qu'un INSERT a eu lieu ? en soit, c'est fonctionnel et permet de récupérer les nouvelles lignes. Par contre, ça me paraît compliqué par rapport à exécuter un bête SELECT pour récupérer tous les événements insérés depuis le dernier événement déjà récupéré. Cette méthode là me paraîtrait plus propre, moins complexe (et donc moins potentiellement buggée).
Guillaume.
Hors ligne
#3 22/02/2019 13:47:59
- jb2019
- Membre
Re : SELECT suivi de LISTEN
Bonjour,
merci pour votre réponse.
Mon problème est de combiner les 2 opérations.
Un LISTEN va écouter les nouveaux événements à partir du moment ou la requête LISTEN est executée et le SELECT va d'un événement passé à un autre passé.
En fait il faudrait une commande du type LISTEN_SINCE(t) qui va émettre les lignes une par une depuis l'instant t, rattraper la fin des événements stockés, puis attendre et émettre les nouveaux...
Est-ce qu'un gourou postgresql à entendu parler de ça ?
Hors ligne
#4 22/02/2019 14:57:40
- gleu
- Administrateur
Re : SELECT suivi de LISTEN
Ça n'existe pas.
Guillaume.
Hors ligne
#5 22/02/2019 15:24:27
- rjuju
- Administrateur
Re : SELECT suivi de LISTEN
Avec votre solution, que se passe-t-il si un INSERT a lieu et que votre daemon python n'est pas connecté? À priori vous allez perdre des informations.
Je pense comme Guillaume qu'un simple SELECT pour récupérer les événements insérés depuis le dernier événement est plus simple. Vous pouvez sinon utiliser un slot de réplication, avec un plugin de décodage au format qui vous convient.
Julien.
https://rjuju.github.io/
Hors ligne
#6 22/02/2019 18:32:40
- jb2019
- Membre
Re : SELECT suivi de LISTEN
@gleu: ça confirme mes soupçons.
@rjuju: avec ma méthode si mon daemon python est déconnecté, lors de la reconnexion, il sait à quel t il était, récupère par des SELECT successifs les événements jusqu'a ce que la requête retourne 0 résultats puis switch sur le LISTEN pour les nouveaux...
Comme je disais: ça fonctionne avec une charge modérée... je n'ai pas testé en mettant la pression.
Je vais creuser la piste de la réplication logique... d'après ce que j'en connais aujourd'hui ça pourrait peut-être correspondre.
Merci en tout cas pour vos réponses !
EDIT - 18:03
En creusant du côté de la réplication logique j'ai trouvé ça sur psycopg2:
http://initd.org/psycopg/docs/extras.ht … eplication
et un outil python qui semble avoir creuser le sujet:
https://github.com/GambitResearch/replisome
Dernière modification par jb2019 (22/02/2019 19:05:19)
Hors ligne
Pages : 1