2010-02-18 35 views
5

là nó có thể chỉ định một số cột trong SQLAlchemy được trì hoãn tải? Tôi đang sử dụng các mô-đun sqlalchemy.ext.declarative để xác định bản đồ của tôi, ví dụ:SQLAlchemy.declarative và trì hoãn cột tải

from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class SomeClass(Base): 
    __tablename__ = 'some_table' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 

Tôi muốn ví dụ như tên cột được lười biếng tải, làm thế nào tôi có thể thực hiện điều đó?

Cảm ơn bạn Jan

+0

là gì những lý do bạn có thể muốn o trì hoãn tải? Bạn có sẵn sàng thay đổi lược đồ Mô hình hoặc DB để làm cho nó hoạt động không? – van

Trả lời

10

Chỉ cần thêm deferred() xung quanh việc kê khai cột:

class SomeClass(Base): 
    __tablename__ = 'some_table' 
    id = Column(Integer, primary_key=True) 
    name = deferred(Column(String(50))) 
+0

+1: đơn giản và đẹp – van

2

Đừng xác định việc lập bản đồ cho các cột mà bạn muốn tải theo yêu cầu. Sau đó, cấu hình chúng như được mô tả trong các Deferred Column Loading sử dụng đối tượng mapper. Đổi mã ở đây:

from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class SomeClass(Base): 
    __tablename__ = 'some_table' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 
    #big_name = Column(String(500)) 

SomeClass.__table__.append_column(Column('big_name', String(500))) 
SomeClass.__mapper__.add_property('big_name', deferred(SomeClass.__table__.c.big_name)) 

Chạy mã kiểm tra này:

c = session.query(SomeClass).first() 
# here SQL is loading all configured properties, but big_name 
print "c: ", c 
# only here another SQL request is made to load the property 
print "big_name: ", c.big_name 

sản xuất bản ghi trích:

... INFO sqlalchemy.engine.base.Engine.0x...77d0 SELECT some_table.id AS some_table_id, some_table.name AS some_table_name 
FROM some_table 
LIMIT 1 OFFSET 0 

... INFO sqlalchemy.engine.base.Engine.0x...77d0 SELECT some_table.big_name AS some_table_big_name 
FROM some_table 
WHERE some_table.id = ? 
Các vấn đề liên quan