2010-02-18 14 views
5

क्या स्क्लेक्लेमी में कुछ कॉलम स्थगित-लोड होने के लिए निर्दिष्ट करना संभव है? मैं अपने मानचित्रण, उदाहरण परिभाषित करने के लिए sqlalchemy.ext.declarative मॉड्यूल का उपयोग कर रहा: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)) 

मैं उदाहरण के स्तंभ नाम आलसी लोड किया जा के लिए चाहते हैं, मैं यह कैसे पूरा कर सकते हैं?

आप जनवरी

+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 

लॉग निकालने का उत्पादन कारण आप टी चाहते हैं ओ लोडिंग स्थगित? क्या आप इसे काम करने के लिए मॉडल या डीबी स्कीमा को बदलने के इच्छुक हैं? – 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 = ? 
संबंधित मुद्दे