2015-04-09 2 views
0

Je travaille sur un projet utilisant python dans le cadre de flask. J'utilise aussi SQLAlchemy pour faire toutes les transactions DB.Relève longue en flacon Python avec SQLALCHEMY

Je fais une longue interrogation pour vérifier les nouvelles entrées dans une table db. Je rencontre un problème avec SQLAlchemy

La comparaison de datetimes ne semble pas fonctionner. Une explication qui aurait du sens est que SQLAlchemy met en cache les résultats, mais d'après ce que j'ai lu en ligne ce ne serait pas le cas.

Voici mon code (Toutes mes excuses pour les pauvres formatage ne peuvent pas l'obtenir ici sur stackoverflow):

@app.route('/poll') 
def poll(): 
now = datetime.utcnow() 
print(models.dump_datetime(now)) 

timeout = time.time() + 60*1 
while time.time() <= timeout: 
    time.sleep(0.5) 
    db.session.expire_all() 
    check = AuditLogEntry.query.filter((AuditLogEntry.datetime >= now) 
    & ((AuditLogEntry.action == "action1") | (AuditLogEntry.action == "action2"))) 
    if(check.count() > 0): 
     for c in check: 
      print(c.to_dict()) 
     break 

return "DONE" 

Ainsi, lorsque la fonction poll() est d'abord appelé, il enregistre le temps comme datetime. Il recherche ensuite dans la base de données les lignes qui ont un datetime plus tard que now. S'il en trouve un, il devrait l'imprimer sur la console et casser la boucle.

Cependant, pour le dire simplement cela ne fonctionne pas. Lorsqu'une nouvelle ligne est ajoutée, et l'heure est après l'heure stockée dans now, il ne le remarque pas.

Aussi, lorsque je teste pour m'assurer que le now est correct, et comparable au datetime dans le test AuditLogEntry.datetime with the following code, I can print the count of »et c'est le nombre de lignes dans ma table. Donc ça marche.

test = AuditLogEntry.query.filter((AuditLogEntry.datetime < now) & ((AuditLogEntry.action == "action1") | 
                     (AuditLogEntry.action == "action2"))) 
print(test.count()) 

db.session.expire_all() ne semble pas fonctionner. Le jeu de résultats ne semble pas changer.

Toute aide serait grandement appréciée !!!

Répondre

0

J'ai essayé de supprimer la ligne db.session.expire_all() et j'ai ajouté db.session.commit après la requête SQLAlchemy, et cela fonctionne.

Je ne suis pas entièrement sûr pourquoi cela fonctionne, je serais ravi que quelqu'un puisse m'expliquer :)