Bonjour,
Je n'ai pas de très grandes compétences en Python et l'utilisation des bases de données. Habituellement je trouve la solution en cherchant un peu partout dans les forums mais là je reste sans solution... Je vous pose le contexte :
J'ai une base de donnée MySQL qui reçoit des blocks de données provenant d'un automate. Ces données ne sont rien d'autre que des variables que j'ai crée dans un automate de simulation. Par exemple toutes les 5 secondes j'ai en même temps un block de 10 variables qui est envoyé dans la bdd. Ces données sont formées notamment d'un Id, un nom, une valeur ainsi qu'un horodatage (timestamp).
Pour facilité la compréhension, enfin je l'espère, je vais appeler mes variables de n°1 à 10.
Mon objectif est de, par exemple, dés que ma variable n°2 passe à 1 (variable discrète) je puisse récupérer dans la bdd disons toutes les variables 4,6 et 8 qui ont été insérées dans la bdd durant les 5 minutes AVANT l'apparition dans ma bdd de la variable n°2 qui est passé à 1. Ca c'est l'idée générale. Le tout en utilisant Python bien évidemment 
Dans l'idéal y faudrait le faire en temps réel mais je vais me contenter d'essayer de le faire sans déjà.
J'ai ma connexion avec la bdd d'établie, et je bloque sur comment faire déjà pour sélectionner une plage de données sur un intervalle de 5 min avant l'apparition de ma variable n°2 à 1. En cherchant j'ai vue qu'il y avait quelque chose du genre "SELECT * FROM matable WHERE timestamp BETWEEN '2019-02-21 19:54:27' AND '2019-02-21 19:54:32'" pour la sélection d'une plage de données dans un intervalle de temps mais ça ne me sort pas de valeur...
Quel serait selon vous le meilleur moyen de programmer ce genre de chose ? Comment lire la bdd à partir de la dernière valeur entrée, détecter la variable cible n°2 qui est passée à 1 et ensuite lui dire "tu lis toutes les variables n°4, 6 et 8 qui sont apparues durant les 5 minutes avant l'apparition de la variable n°2" ?
J'utilise la commande suivante pour détecter la dernière donnée de ma variable n°2 :
cursor.execute("SELECT * FROM matable WHERE variable2 ORDER BY timestamp DESC LIMIT 1")
Il semble que ça sélectionne bien la dernière variable n°2 qui est passée à 1.
J'ai par la suite pu prendre le datetime de ma variable n°2 et lui enlever une minute pour par la suite effectuer un BETWEEN au niveau de ma requête.
cursor.execute("SELECT valeur FROM matable WHERE Id_Num IN ('Csup','Cinf') AND Horodatage BETWEEN (%s) AND (%s)", (r2,r))
r et r2 étant les 2 datetime, le résultat ne me donne en fait qu'une valeur de Csup et Cinf qui sont 2 variables que je cherche dans mon intervale de temps. Ces variables sont bien dans la période ciblée mais elles devraient apparaitre plusieurs fois or elles n'apparaissent qu'une fois... Je ne vois pas trop pourquoi.
Merci par avance pour l'aide que vous me porterez je l'espère!
Partager