Was ist der Unterschied zwischen back_populate und backref in SQL Alchemy? Was passiert, wenn ich keinen von beiden schreibe? Die Geschichte.
Um aus der Schlussfolgerung zu schreiben,
(1) Wenn Backref verwendet wird Es wird automatisch eine wechselseitige Beziehung erstellt.
(2) Wenn back_populate verwendet wird Sie müssen selbst eine wechselseitige Beziehung herstellen.
(3) Wenn weder back_populated noch backref verwendet wird Umgekehrte Felder werden während einer Transaktion nicht automatisch aktualisiert.
Es stellt sich heraus, dass.
Schauen wir uns ein konkretes Beispiel an. Betrachten Sie das Ereignismodell und das Ticketmodell als Beispiele. Ein Event hat mehrere Tickets, eine Eins-zu-Viele-Beziehung.
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
Wenn Sie back_populate verwenden, funktioniert dies nur, wenn Sie eine bidirektionale Beziehung haben.
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
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
In diesem Fall ist Ticket → Ereignis Keine. Mit anderen Worten ist ersichtlich, dass das Ereignis nicht mit dem Ticket in der Transaktion verknüpft ist. Nach dem Ende der Transaktion (nach dem Einfügen des Ereignisobjekts) werden sie natürlich in beide Richtungen verknüpft.
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