SQLAlchemy.declarative и задержанная загрузка столбца

действительно ли возможно указать некоторые столбцы в SQLAlchemy, чтобы быть задержанный загруженным? Я использую sqlalchemy.ext.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))

Я хочу, например, имя столбца быть ленив загруженный, как я могу выполнить это?

Спасибо Jan

6
задан honzas 18 February 2010 в 14:44
поделиться

2 ответа

Просто добавьте deferred() вокруг объявления столбца:

class SomeClass(Base):
    __tablename__ = 'some_table'
    id = Column(Integer, primary_key=True)
    name =  deferred(Column(String(50)))
12
ответ дан 8 December 2019 в 17:21
поделиться

Не определяйте сопоставление для столбцов, которые вы хотите загружать по запросу. Затем настройте их, как описано в Отложенная загрузка столбца , используя объект mapper . Модифицированный код здесь:

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

Запуск этого тестового кода:

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

производит извлечение журнала:

... 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 = ?
2
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: