Mysql
 sql >> Base de données >  >> RDS >> Mysql

À propos de l'actualisation des objets dans la session sqlalchemy

Les sessions sont conçues pour fonctionner comme ceci . Les attributs de l'objet dans la session B conserveront ce qu'il avait lors de la première requête dans la session B. De plus, SQLAlchemy n'essaiera pas d'actualiser automatiquement les objets dans d'autres sessions lorsqu'ils changent, et je ne pense pas non plus qu'il serait sage d'essayer de créer quelque chose comme ça.

Vous devez considérer activement la durée de vie de chaque session comme une seule transaction dans la base de données. Comment et quand les sessions doivent gérer le fait que leurs objets peuvent être obsolètes n'est pas un problème technique qui peut être résolu par un algorithme intégré à SQLAlchemy (ou toute extension pour SQLAlchemy) :c'est un problème "métier" dont vous devez résoudre déterminer et coder vous-même. La réponse "correcte" pourrait être de dire que ce n'est pas un problème :la logique qui se produit avec la session B pourrait être valide si elle utilisait les données au moment où la session B a démarré. Votre "problème" n'en est peut-être pas un. Les docs ont en fait un toute la section sur quand utiliser les sessions , mais cela donne une réponse assez sombre si vous espérez une solution unique...

Cela dit, vous pouvez faire certaines choses pour changer le fonctionnement de la situation :

Tout d'abord, vous pouvez réduire la durée d'ouverture de votre session. La session B interroge l'objet, puis plus tard vous faites quelque chose avec cet objet (dans la même session) dont vous voulez que les attributs soient à jour. Une solution consiste à effectuer cette deuxième opération dans une session distincte.

Une autre consiste à utiliser les méthodes expire/refresh, comme le docs montrer ...

# immediately re-load attributes on obj1, obj2
session.refresh(obj1)
session.refresh(obj2)

# expire objects obj1, obj2, attributes will be reloaded
# on the next access:
session.expire(obj1)
session.expire(obj2)

Vous pouvez utiliser session.refresh() pour obtenir immédiatement une version à jour de l'objet, même si la session a déjà interrogé l'objet plus tôt.