2017-11-07 43 views
6

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?

+1

Czy możesz wyłączyć automatyczne wygaśnięcie sesji? Czy to rozwiązałoby to? –

+0

Tak! Ustawienie 'DBSession.no_autoflush' eliminuje niechcianą instrukcję' SELECT'. Napiszę to. – shroud

Odpowiedz

2

Sam w komentarzach wskazał mi właściwą odpowiedź, DBSession.no_autoflush:

with DBSession.no_autoflush: 
    p = Parent() 
    DBSession.add(p) 

    # some unrelated code runs which triggers a flush 

    p.children = [Child(title=title) for title in titles] 

To eliminuje niechciane SELECT oświadczenie podczas przypisywania do p.children.

+0

Czy sprawi to, że stare dzieci pozostaną nienaruszone w DB, skoro SQLA nie zrobi selekcji lub czy rozliczenie zostanie odroczone? –

+0

Ponieważ właśnie stworzyłem obiekt, wiem, że jeszcze nie ma dzieci. – shroud

+0

Dobrze, tęsknię za tą małą karteczką informacji w poście. Powinien czytać z myślami. –