Quelle est la différence entre les sessions?commit() et session.flush ()?
session.commit()
et session.flush()
dans SQLAlchemy est?
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 lecommit()
appeler avant que le mouvement soit engagé.
valider:
commit()
est utilisé pour propager la transaction courante. Il toujours les questionsflush()
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églageautocommit=True
. En mode autocommit, un la transaction peut être initiée en appelant lebegin()
méthode.
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.
tout droit de la documentation:
commit()
est utilisé pour propager la transaction courante. Il toujours les questionsflush()
avant de vider tout état restant dans la base de données.
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
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èsflush()
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 utilisantflush()
au lieu de commettre une grosse donnée à la fois en utilisantcommit()
et faire face au risque d'obtenir unOut 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 lecommit()
réussit.