2010-02-18 4 views
5

SQLAlchemy에서 일부 열을 지연로드되도록 지정할 수 있습니까? 나는 그것을 달성 할 수있는 방법, 나는 열 이름은로드 게으른 예를 들어 원하는SQLAlchemy.declarative 및 지연 열로드

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)) 

: 내 매핑, 예를 정의 할 sqlalchemy.ext.declarative 모듈을 사용하고?

는 수요에로드 할 열에 대한 매핑을 정의하지 마십시오 당신에게 월

+0

을 무엇

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 

로그 추출물을 생산 네가 원하는 이유 로드 지연? 모델 또는 DB 스키마가 변경되도록 기꺼이 변경 하시겠습니까? – van

답변

10

그냥 열 선언 주위에 deferred()를 추가 :

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

+1 : 간단하고 아름다운 – van

2

감사드립니다. 그런 다음 mapper 개체를 사용하여 Deferred Column Loading에 설명 된대로 구성합니다. 여기 수정 된 코드 :

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)) 

이 테스트 코드를 실행 :

... 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 = ?