Frage

Ich habe einen Fall bekam, wo die meiste Zeit die Beziehungen zwischen den Objekten war so, dass Vorkonfiguration einen eifrigen (kam) Belastung der Beziehung Sinn. Aber jetzt habe ich eine Situation, wo ich wirklich getan werden, nicht die eifrige Last will.

Sollte ich die verbundene Last aus der Beziehung zu entfernen und Ändern aller relevanten Suchanfragen auf Abfragestelle (ick) zu verbinden, oder ist es eine Möglichkeit, einen eifrigen Last in einer Abfrage zu unterdrücken, sobald es eingerichtet ist?

Im Folgenden ist ein Beispiel, in dem eifrig Laden auf der User-> Adressbeziehung eingerichtet wurde. Kann die Abfrage am Ende des Programms nicht eifrig Last konfiguriert werden?

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
import sqlalchemy.orm as orm

##Set up SQLAlchemy for declarative use with Sqlite...
engine = sa.create_engine("sqlite://", echo = True)
DeclarativeBase = declarative_base()
Session = orm.sessionmaker(bind = engine)

class User(DeclarativeBase):
    __tablename__ = "users"
    id = sa.Column(sa.Integer, primary_key = True, autoincrement = True)
    name = sa.Column(sa.String, unique = True)
    addresses = orm.relationship("Address",
                                 lazy = "joined", #EAGER LOAD CONFIG IS HERE
                                 )
    def __init__(self, Name):
        self.name = Name

class Address(DeclarativeBase):
    __tablename__ = "addresses"
    id = sa.Column(sa.Integer, primary_key = True, autoincrement = True)
    address = sa.Column(sa.String, unique = True)
    FK_user = sa.Column(sa.Integer, sa.ForeignKey("users.id"))
    def __init__(self, Email):
        self.address = Email

##Generate data tables...
DeclarativeBase.metadata.create_all(engine)

##Add some data...
joe = User("Joe")
joe.addresses = [Address("joe@example.com"),
                 Address("joeyjojojs@example.net")]
s1 = Session()
s1.add(joe)
s1.commit()

## Access the data for the demo...
s2 = Session()

#How to suppress the eager load (auto-join) in the query below?
joe = s2.query(User).filter_by(name = "Joe").one() # <-- HERE?
for addr in joe.addresses:
    print addr.address
War es hilfreich?

Lösung

Sie können außer Kraft setzen Eifer von Eigenschaften auf Abfrage-by-Abfrage Basis, soweit ich mich erinnere. Wird diese Arbeit?

from sqlalchemy.orm import lazyload
joe = (s2.query(User)
    .options(lazyload('addresses'))
    .filter_by(name = "Joe").one())
for addr in joe.addresses:
    print addr.address

Siehe die Dokumentation.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top