Quelle est la différence entre les sessions?commit() et session.flush ()?

<!-Est-ce que quelqu'un sait quelle est la principale différence entre session.commit() et session.flush() dans SQLAlchemy est?

19
demandé sur Nathan Wailes 2011-09-19 17:12:01

5 réponses

Voici quelques citations de l' documentation.

quinte:

quand le Session est utilisé avec sa configuration par défaut, le flush l'étape est presque toujours effectué de manière transparente. Plus précisément, la chasse d'eau se produit avant qu'une requête individuelle soit émise, ainsi que dans le commit() appeler avant que le mouvement soit engagé.

valider:

commit() est utilisé pour propager la transaction courante. Il toujours les questions flush() avant d'envoyer tout état restant dans la base de données; cette est indépendant du réglage" autoflush". Si aucune transaction n'est l'heure actuelle, il génère une erreur. Notez que le comportement par défaut du Session est qu'une" transaction " est toujours présente; ce comportement peut être désactivé par le réglage autocommit=True. En mode autocommit, un la transaction peut être initiée en appelant le begin() méthode.

15
répondu NPE 2011-09-19 13:17:16

la façon la plus facile que je sais comment expliquer ce que ces faire est de vous montrer, en utilisant echo=True:

>>> session.flush()
BEGIN (implicit)
INSERT INTO users (username, password) VALUES (?, ?)
('alice', None)
>>> session.commit()
COMMIT
>>> 

flush() envoie les données à la base de données. commit()COMMIT, qui dit à la base de données de conserver les données qui viennent d'être envoyées. Comme d'autres l'ont dit, commit() causera aussi un flush() pour se produire, si c'est nécessaire.

9
répondu SingleNegationElimination 2016-03-23 16:05:49

tout droit de la documentation:

commit() est utilisé pour propager la transaction courante. Il toujours les questions flush() avant de vider tout état restant dans la base de données.

4
répondu Matt Ball 2011-09-19 13:15:37

bien que les réponses ci-dessus soient correctes, la caractéristique la plus utile de flush est d'appliquer les changements apportés à la table dans la base de données de nouveau dans l'objet concerné dans le code. Voici un exemple, Supposons que vous enregistrez un utilisateur et que vous voulez lui rendre son id,

u = User(name,address,phone) #id is autogenerated 
session.add(u)
session.commit() #calls flush beforehand, but we need it after the commit
session.flush() #updates the objects of the session 
print(u.id) #id field of the User object updated after the flush

Vous n'avez pas besoin d'interroger à nouveau pour obtenir son id!! Espérons que cela aide

3
répondu Chandan Purohit 2017-02-10 09:12:57

flush() synchronisera votre base de données avec l'état actuel de l'objet/des objets détenus dans la mémoire, mais il ne déclenche pas la transaction. Donc, si vous obtenez une exception après flush() est appelée, alors la transaction sera annulée. Vous pouvez synchroniser votre base de données avec de petits morceaux de données en utilisant flush() au lieu de commettre une grosse donnée à la fois en utilisant commit() et faire face au risque d'obtenir un Out Of Memory exception.

commit() va rendre les données stockées dans la base de données permanente. Il n'y a aucun moyen que vous puissiez annuler votre transaction une fois le commit() réussit.

Source:https://stackoverflow.com/a/26976077/4115031

0
répondu Nathan Wailes 2017-10-15 05:46:39