[PYTHON] Différence entre SQLAlchemy flush () et commit ()

Explique comment utiliser correctement flush () et commit () lors de la manipulation des enregistrements de table à l'aide de SQLAlchemy, qui est l'un des mappeurs O / R de Python.

Récemment, j'ai commencé à l'utiliser au travail et j'apprends petit à petit.

Si vous voulez l'exprimer facilement avec des mots flush (): reflète temporairement le résultat de la requête dans la base de données (le rollback est possible, donc si vous ne commettez pas (), la requête sera invalide et vous devrez commettre () à la fin) commit (): reflète en permanence les résultats de la requête dans la base de données (ajout complet, mise à jour et suppression d'enregistrements)

Pour chaque utilisation Il est pratique d'utiliser flush () lorsque vous voulez revenir en arrière en cas d'erreur et que cela ne soit pas reflété dans la base de données.

Par exemple

session.begin()
try:
    for item in session.query(Model).all():
       session.add(Model)
       session.flush() # <-En attente
    session.commit() # <-Reflété en permanence dans la base de données ici
except:
   session.rollback() #Ignorez l'état de maintien et il n'y a aucune réflexion dans la base de données
finally:
    session.close() #L'erreur se produit et se termine normalement, fermez la session dans les deux cas

Au contraire, si vous ne voulez pas revenir en arrière, utilisez commit ()

session.begin()
try:
    for item in session.query(Model).all():
       session.add(Model)
       session.commit() # <-Reflété en permanence dans la base de données à chaque fois
except Exception as e:
   print('Error:{}'.format(str(e)))
   raise e
finally:
    session.close() #L'erreur se produit et se termine normalement, fermez la session dans les deux cas

Utilisez commit () si vous voulez que le contenu du traitement soit reflété dans la base de données à la fin du traitement sans provoquer d'erreur.

La description officielle est dans la documentation officielle Session.flush(),Session.commit() (C'était un peu difficile de lire le document;)

Autres fonctionnalités de commit (), pour autant que je sache en lisant la documentation officielle · Si vous utilisez une session avec autocommit = False en mode par défaut, une nouvelle transaction sera lancée immédiatement après la validation.

Avec cette fonctionnalité, je me demande si session.close () peut encore être flush () ou commit () sans créer de session? Si quelqu'un peut le comprendre, je vous serais reconnaissant de bien vouloir me le faire savoir.

Recommended Posts

Différence entre SQLAlchemy flush () et commit ()
Différence entre SQLAlchemy filter () et filter_by ()
Différence entre processus et travail
Différence entre "categorical_crossentropy" et "sparse_categorical_crossentropy"
Différence entre régression et classification
Différence entre np.array et np.arange
Différence entre MicroPython et CPython
Différence entre ps a et ps -a
Différence entre return et print-Python
Différence entre Ruby et Python Split
Différence entre java et python (mémo)
Différence entre list () et [] en Python
Mémorandum (différence entre csv.reader et csv.dictreader)
(Remarque) Différence entre la passerelle et la passerelle par défaut
Différence entre le randint de Numpy et le randint de Random
Différence entre tri et tri (mémorial)
Différence entre la série python2 et la série python3 dict.keys ()
Différence entre les back_populates et backref de SQL Alchemy et lorsque ni l'un ni l'autre n'est utilisé
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
[Xg boost] Différence entre softmax et softprob
différence entre les instructions (instructions) et les expressions (expressions) en Python
[Django ORM] Différence entre values () et only ()
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Différence entre la régression linéaire, la régression Ridge et la régression Lasso
Différence entre le fichier env_file docker-compose et le fichier .env
[Python Iroha] Différence entre List et Tuple
[python] Différence entre la sortie rand et randn
Différence de vitesse entre wsgi, bouteille et flacon
Différence entre numpy.ndarray et list (dimension, taille)
Différence entre ls -l et la commande cat
Vérification de la différence et de la compatibilité entre keras et tf.keras # 1
Quelle est la différence entre «pip» et «conda»?
Différence entre l'utilisation et l'importation sur le langage de bouclier
[python] Différence entre variable et self. Variable dans la classe
À propos de la différence entre "==" et "is" en python
À propos de la différence entre PostgreSQL su et sudo
Quelle est la différence entre Unix et Linux?
Prise en compte de la différence entre la courbe ROC et la courbe PR
Différence approximative entre Unicode et UTF-8 (et ses compagnons)
BERT peut-il comprendre la différence entre «Ame (bonbons)» et «Ame (pluie)»?
Entre paramétrique et non paramétrique
Différence entre Ruby et Python en termes de variables
Quelle est la différence entre usleep, nanosleep et clock_nanosleep?
Utilisez SQL Alchemy et le multitraitement
Différence entre la notation Numpy (n,) et (n, 1) [Différence entre le vecteur horizontal et le vecteur vertical]
Différence entre return, return None et no return description en Python
Comment utiliser argparse et la différence entre optparse
Quelle est la différence entre les liens symboliques et les liens durs?
Module Python num2words Différence de comportement entre l'anglais et le russe
Python> Différence entre la sortie inpbt et print (inpbt)> [1. 2. 3.] / array ([1., 2., 3.], dtype = float32)
Comprendre la différence entre l'affectation cumulative aux variables et l'affectation cumulative aux objets
Méthode de concaténation de liste en python, différence entre list.extend () et opérateur «+»
Différence entre le processus de premier plan et le processus d'arrière-plan compris par principe
Conversion entre unixtime et datetime
métaclasse python et déclaration sqlalchemy