Pourquoi vider si vous pouvez vous engager?
En tant que nouvel utilisateur de bases de données et de sqlalchemy, les réponses précédentes - qui flush()
envoient des instructions SQL à la base de données et les conservent commit()
- n'étaient pas claires pour moi. Les définitions ont un sens, mais il n'est pas immédiatement clair à partir des définitions pourquoi vous utiliseriez un vidage au lieu de simplement vous engager.
Étant donné qu'un commit vide toujours ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html#committing ) ces sons sont vraiment similaires. Je pense que le gros problème à souligner est qu'un vidage n'est pas permanent et peut être annulé, alors qu'un commit est permanent, dans le sens où vous ne pouvez pas demander à la base de données d'annuler le dernier commit (je pense)
@snapshoe souligne que si vous souhaitez interroger la base de données et obtenir des résultats qui incluent des objets nouvellement ajoutés, vous devez d'abord vider (ou valider, ce qui videra pour vous). Peut-être que cela est utile pour certaines personnes, même si je ne sais pas pourquoi vous souhaitez vider plutôt que de valider (à part la réponse triviale qu'elle peut être annulée).
Dans un autre exemple, je synchronisais des documents entre une base de données locale et un serveur distant, et si l'utilisateur décidait d'annuler, tous les ajouts / mises à jour / suppressions devraient être annulés (c'est-à-dire pas de synchronisation partielle, seulement une synchronisation complète). Lors de la mise à jour d'un seul document, j'ai décidé de simplement supprimer l'ancienne ligne et d'ajouter la version mise à jour du serveur distant. Il s'avère qu'en raison de la façon dont sqlalchemy est écrit, l'ordre des opérations lors de la validation n'est pas garanti. Cela a entraîné l'ajout d'une version en double (avant de tenter de supprimer l'ancienne), ce qui a entraîné l'échec d'une base de données unique de la base de données. Pour contourner cela, j'ai utilisé flush()
afin que l'ordre soit maintenu, mais je pouvais toujours annuler si plus tard le processus de synchronisation échouait.
Voir mon article à ce sujet à: Y a - t-il une commande pour ajouter ou supprimer lors de la validation dans sqlalchemy
De même, quelqu'un voulait savoir si l'ajout d'un ordre est maintenu lors de la validation, c'est-à-dire si j'ajoute object1
puis ajoute object2
, est- object1
il ajouté à la base de données avant object2
que SQLAlchemy enregistre l'ordre lors de l'ajout d'objets à la session?
Encore une fois, ici, vraisemblablement, l'utilisation d'un flush () assurerait le comportement souhaité. Donc, en résumé, une utilisation de flush est de fournir des garanties de commande (je pense), encore une fois tout en vous permettant une option "annuler" que la validation ne fournit pas.
Autoflush et Autocommit
Remarque, le nettoyage automatique peut être utilisé pour garantir que les requêtes agissent sur une base de données mise à jour car sqlalchemy sera vidé avant d'exécuter la requête. https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
L'autocommit est autre chose que je ne comprends pas complètement, mais il semble que son utilisation soit déconseillée:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params. validation automatique
Utilisation de la mémoire
Maintenant, la question d'origine voulait en fait connaître l'impact de la purge par rapport à la validation à des fins de mémoire. Comme la capacité de persister ou non est quelque chose que la base de données offre (je pense), un simple rinçage devrait être suffisant pour décharger la base de données - bien que la validation ne devrait pas nuire (en fait probablement utile - voir ci-dessous) si vous ne vous souciez pas de l'annulation .
sqlalchemy utilise un référencement faible pour les objets qui ont été vidés: https://docs.sqlalchemy.org/en/13/orm/session_state_management.html#session-referencing-behavior
Cela signifie que si vous n'avez pas d'objet explicitement conservé quelque part, comme dans une liste ou un dict, sqlalchemy ne le gardera pas en mémoire.
Cependant, vous devez vous soucier du côté de la base de données. Vider probablement sans commettre s'accompagne d'une pénalité de mémoire pour maintenir la transaction. Encore une fois, je suis nouveau dans ce domaine, mais voici un lien qui semble suggérer exactement ceci: https://stackoverflow.com/a/15305650/764365
En d'autres termes, les validations devraient réduire l'utilisation de la mémoire, bien qu'il y ait vraisemblablement un compromis entre la mémoire et les performances ici. En d'autres termes, vous ne souhaiterez probablement pas valider chaque modification de la base de données une par une (pour des raisons de performances), mais une attente trop longue augmentera l'utilisation de la mémoire.