2010-02-18 2 views
5

ist es möglich, einige Spalten in der SQLAlchemy zum verzögerten Laden anzugeben? Ich bin mit dem sqlalchemy.ext.declarative Modul meine Mapping Beispiel zu definieren:SQLAlchemy.declarative and 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)) 

ich zum Beispiel möchte, dass die Spaltennamen faul geladen sein, wie kann ich das erreichen?

Danke Jan

+0

Was sind die Gründe, die Sie vielleicht wollen o Aufladen verschieben? Sind Sie bereit, das Model- oder DB-Schema zu ändern, damit es funktioniert? – van

Antwort

10

Fügen Sie einfach deferred() um die Spalte Erklärung:

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

+1: einfach und schön – van

2

Sie die Zuordnung für die Spalten nicht definieren, die Sie bei Bedarf geladen werden soll. Konfigurieren Sie dann diese wie im Objekt Deferred Column Loading beschrieben mit dem Objekt mapper. Modifizierte Code hier:

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

Ausführen dieses Testcode:

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 

produziert Protokollauszug:

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