mam następujące modele sqlalchemy:Unikanie wybierz po spłukiwania podczas przypisywania do relacji dziecka
class Parent(Base):
id = Column(Integer, primary_key=True)
class Child(Base):
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
parent_id = Column(Integer, ForeignKey(Parent.id), nullable=False)
parent = relationship(Parent,
backref=backref('children',
order_by=id,
cascade='all, delete-orphan'))
A potem chcę stworzyć rodzica i niektóre dzieci, wszystkie w tym samym oświadczeniu:
p = Parent()
DBSession.add(p)
# some unrelated code runs which triggers a flush
p.children = [Child(title=title) for title in titles]
Ta instrukcja przypisania p.children =
wyzwala niechciane oświadczenie SELECT
, ponieważ SQLAlchemy musi wyczyścić wszelkie istniejące wcześniej obiekty Child
wskazujące na . Zdaję sobie sprawę, że mogę wyeliminować oświadczenie SELECT
za pomocą opcji lazy='noload'
na backref, ale potrzebuję tej relacji do normalnego funkcjonowania (tj. Do pobierania wyników z DB) w innych kontekstach.
Czy istnieje sposób, w jaki mogę utworzyć właściwość, która zwraca wartość relacji noload
, jeśli została ustawiona, i w inny sposób wykorzystuje zwykły związek do załadowania wyników z DB? Czy nawet myślę o tym we właściwy sposób?
Czy możesz wyłączyć automatyczne wygaśnięcie sesji? Czy to rozwiązałoby to? –
Tak! Ustawienie 'DBSession.no_autoflush' eliminuje niechcianą instrukcję' SELECT'. Napiszę to. – shroud