2011-01-05 36 views
14

Tôi đã có một trường hợp mà hầu hết thời gian các mối quan hệ giữa các đối tượng là như vậy mà trước khi cấu hình một mong muốn (tham gia) tải về mối quan hệ có ý nghĩa. Tuy nhiên bây giờ tôi đã có một tình huống mà tôi thực sự không muốn tải mong muốn được thực hiện.Có thể SQLAlchemy háo hức/tham gia tải được ngăn chặn một lần thiết lập?

Tôi có nên xóa tải đã kết nối khỏi mối quan hệ và thay đổi tất cả các truy vấn có liên quan để tham gia tại vị trí truy vấn (ick) hay không, hoặc có cách nào đó để chặn tải mong muốn trong truy vấn sau khi được thiết lập?

Dưới đây là ví dụ khi tải mong muốn đã được thiết lập trên mối quan hệ Người dùng-> Địa chỉ. Có thể truy vấn ở cuối chương trình được cấu hình để KHÔNG tải háo hức không?

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("[email protected]"), 
       Address("[email protected]")] 
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 

Trả lời

21

Bạn có thể ghi đè các thuộc tính trên truy vấn theo truy vấn, theo như tôi nhớ. Điều này có hiệu quả không?

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 

Xem the docs.

+0

Đó có phải nó ... thx. – Russ

Các vấn đề liên quan