11
votes

Comment éviter la mise en cache dans Sqlalchemy?

J'ai un problème avec SQL Alchemy - mon application fonctionne comme une application Python en constante action.

J'ai une fonction comme ceci: xxx

Je pense que cela est clair Exemple - Un ensemble de résultats est extrait de la base de données, la seconde est juste passée en tant qu'argument.

Le problème est que lorsque je modifie des données dans ma base de données, cette fonction renvoie toujours des données telles que rien n'a été modifié. Lorsque je modifie les données du paramètre d'entrée, le paramètre renvoyé "Calcul" a une valeur correcte.

Lorsque je redémarre le serveur d'applications, la situation revient à la normale - de nouvelles données sont extraites de MySQL.

Je sais qu'il y avait plusieurs questions sur la mise en cache SQLalchemy comme:

Comment désactiver la mise en cache correctement dans Sqlalchemy Orm Session? < / a>

Comment désactiver la mise en cache SQLalchemy?

Mais comment autre puis-je appeler cette situation? Il semble que SQLalchemy conserve les données extraites avant et n'effectue pas de nouvelles requêtes tant que le redémarrage de l'application. Comment puis-je éviter un tel comportement?


3 commentaires

Comment changez-vous les données dans la base de données? Est-ce que cela a changé commis?


Je le change manuellement. Le moteur de base de données est MySQL. Oui, le changement est commis.


Stackoverflow.com/a/15788051/497208 peut être utile


3 Réponses :


2
votes

Quelques possibilités.

  1. Vous réutilisez votre session incorrectement ou à un moment inapproprié. La meilleure pratique consiste à jetter votre de la session après votre commission et d'en obtenir un nouveau au dernier moment possible avant de l'utiliser. Le comportement qui semble être la mise en cache peut en fait être dû à une session de la durée de vie très longue dans votre application.
  2. Les objets qui survivent plus longtemps que la session ne sont pas fusionnés dans une session ultérieure . Les "métadonnées" peuvent ne pas être en mesure de mettre à jour leur état si vous ne les fusionnez pas. C'est plus une préoccupation pour l'API ORM de SQLalchemy, que vous n'apparaissez pas si loin d'utiliser.
  3. Vos modifications ne sont pas engagées. Vous dites qu'ils sont donc nous allons supposer que ce n'est pas ça, mais si aucune des autres voies ne l'explique, vous voudrez peut-être regarder à nouveau.

    Un astuce de débogage général: Si vous voulez savoir exactement ce que SQLalchemy fait dans la base de données, passez echo = true à la fonction create_Engine . Le moteur imprimera toutes les requêtes qu'il court.

    aussi . Cette suggestion j'ai faite à quelqu'un d'autre, qui utilisait Orm et avait des problèmes de transacalité, qui résolvaient leur problème sans jamais l'identifier. Peut-être que cela vous aidera.


0 commentaires

16
votes

appeler session.expire_all () expulsera toutes les données chargées de la base de données de la session. Tout accès des attributs d'objets suivants émet un nouveau Sélectionnez l'instruction et obtient de nouvelles données. S'il vous plaît voir http://docs.sqlalchemy.org/fr/Latest /orm/session_state_management.html#refreshing-expiring pour fond.

Si vous voyez toujours appelé "Caching" après avoir appelé expire_all () , alors vous devez fermer les transactions comme décrit dans mon Réponse liée ci-dessus.


0 commentaires

1
votes

Vous devez modifier le niveau d'isolation des transactions vers READ_COMMITS http://docs.sqlalchemy.org/fr/ rel_0_9 / dialectes / mysql.html # MySQL-Isolation-Niveau


0 commentaires