2010-02-18 16 views
5

jest możliwe określenie niektórych kolumn w SQLAlchemy do odroczenia obciążenia? Używam moduł sqlalchemy.ext.declarative definiować moje mapowania, przykład:SQLAlchemy.deklaratywny i odroczony ładowanie kolumny

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

chcę na przykład nazwa kolumny leń załadowany, w jaki sposób można tego dokonać?

Dziękuję sty

+0

Jakie są powody, dla których możesz chcieć t o odłożyć ładowanie? Czy chcesz zmienić model lub schemat DB, aby działał? – van

Odpowiedz

10

Wystarczy dodać deferred() wokół deklaracji kolumny:

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

+1: proste i piękne – van

2

Nie zdefiniować mapowanie dla kolumn, które chcesz załadować na żądanie. Następnie skonfiguruj te zgodnie z opisem w obiekcie Deferred Column Loading przy użyciu obiektu mapper. Zmodyfikowany kod tutaj:

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

Uruchomienie tego kodu testu:

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 

produkuje ekstrakt dziennika:

... 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 = ? 
Powiązane problemy