[PYTHON] Différence entre les back_populates et backref de SQL Alchemy et lorsque ni l'un ni l'autre n'est utilisé

Quelle est la différence entre back_populates et backref dans SQL Alchemy? Que se passe-t-il si je n'écris aucun d'eux? L'histoire.

Pour écrire à partir de la conclusion,

(1) Lorsque backref est utilisé Cela crée automatiquement une relation bidirectionnelle.

(2) Lorsque back_populates est utilisé Vous devez créer vous-même une relation bidirectionnelle.

(3) Lorsque ni back_populates ni backref ne sont utilisés Les champs annulés ne sont pas automatiquement mis à jour lors d'une transaction.

Il se trouve que.

Regardons un exemple concret. Considérez le modèle d'événement et le modèle de ticket comme exemples. Un événement a plusieurs billets, une relation un à plusieurs.

Lors de l'utilisation de backref

class Event(Base):
	__tablename__ = 'event'
	id = Column(Integer, primary_key=True)
	title = Column(String(255))
	tickets = relationship("Ticket",backref="event")

class Ticket(Base):
	__tablename__ = 'ticket'
	id = Column(Integer,primary_key=True)
	title = Column(String(255))
	value = Column(Integer)
	event_id = Column(Integer,ForeignKey('event.id'))
event = Event(title="test")
ticket = Ticket(title="test_ticket",value=5000)
event.tickets = [ticket]

event.tickets #Ticket Objects
ticket.event #Event Object

Lors de l'utilisation de back_populates

Lorsque vous utilisez back_populates, cela ne fonctionnera que si vous avez une relation bidirectionnelle.

class Event(Base):
	__tablename__ = 'event'
	id = Column(Integer, primary_key=True)
	title = Column(String(255))
	tickets = relationship("Ticket",back_populates="event")

class Ticket(Base):
	__tablename__ = 'ticket'
	id = Column(Integer,primary_key=True)
	title = Column(String(255))
	value = Column(Integer)
	event_id = Column(Integer,ForeignKey('event.id'))
	event = relationship("Event",back_populates="tickets")
event = Event(title="test")
ticket = Ticket(title="test_ticket",value=5000)
event.tickets = [ticket]

event.tickets #Ticket Objects
ticket.event #Event Object

Si ni l'un ni l'autre n'est utilisé

class Event(Base):
	__tablename__ = 'event'
	id = Column(Integer, primary_key=True)
	title = Column(String(255))
	tickets = relationship("Ticket")

class Ticket(Base):
	__tablename__ = 'ticket'
	id = Column(Integer,primary_key=True)
	title = Column(String(255))
	value = Column(Integer)
	event_id = Column(Integer,ForeignKey('event.id'))
	event = relationship("Event")
event = Event(title="test")
ticket = Ticket(title="test_ticket",value=5000)
event.tickets = [ticket]

event.tickets #Ticket Objects
ticket.event #None

Dans ce cas, ticket → événement est Aucun. En d'autres termes, on peut voir que l'événement n'est pas associé au ticket dans la transaction. Bien entendu, une fois la transaction terminée (après l'insertion de l'objet événement), ils sont liés dans les deux sens.

event = self.session.query(Event).filter(Event.id==1).one()
ticket = self.session.query(Ticket).filter(Ticket.id==1).one()

event.tickets #Ticket Objects
ticket.event #Event Object

Recommended Posts

Différence entre les back_populates et backref de SQL Alchemy et lorsque ni l'un ni l'autre n'est utilisé
Différence entre SQLAlchemy filter () et filter_by ()
Différence entre == et est en python
Différence entre SQLAlchemy flush () et commit ()
Quelle est la différence entre «pip» et «conda»?
À propos de la différence entre "==" et "is" en python
Quelle est la différence entre Unix et Linux?
Quelle est la différence entre usleep, nanosleep et clock_nanosleep?
Quelle est la différence entre les liens symboliques et les liens durs?
Différence entre processus et travail
Différence entre "categorical_crossentropy" et "sparse_categorical_crossentropy"
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 la série python2 et la série python3 dict.keys ()
[Python] Différence entre fonction et méthode
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
[Introduction à Python] Quelle est la différence entre une liste et un taple?
différence entre les instructions (instructions) et les expressions (expressions) en Python
[Django ORM] Différence entre values () et only ()
Différences dans la relation entre PHP et Python enfin et quitter
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
[Python] Différence entre la méthode de classe et la méthode statique
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