Domanda

Ho un caso in cui la maggior parte del tempo le relazioni tra gli oggetti era tale che pre-configurazione di una (unito) carico sul rapporto ansioso aveva un senso. Comunque ora ho una situazione in cui io davvero non voglio che il carico desiderosi di essere fatto.

Dovrei rimuovere il carico unito dal rapporto e la modifica di tutte le query relative ad unirsi nella posizione richiesta (sigh), o c'è qualche modo per sopprimere un carico ansioso in una query una volta che è impostato?

Di seguito è riportato un esempio in cui eager loading è stato istituito sulla User-> rapporto Indirizzo. Può la query al termine del programma di essere configurato per NON carico ansiosi?

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
È stato utile?

Soluzione

Si potrebbe ignorare desiderio di proprietà su base di query-by-query, per quanto mi ricordo. Sarà questo lavoro?

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

la documentazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top