slqlachemy通过变量声明加入了load

时间:2016-09-23 21:43:36

标签: python sqlalchemy turbogears2

假设我有两个型号。帐户和问题。

class Account(DeclarativeBase):
    __tablename__ = 'accounts'

    id = Column(Integer, primary_key=True)
    user_name = Column(Unicode(255), unique=True, nullable=False)

和我的问题模型如下:

class Question(DeclarativeBase):
    __tablename__ = 'questions'

    id = Column(Integer, primary_key=True)
    content = Column(Unicode(2500), nullable=False)
    account_id = Column(Integer, ForeignKey(
    'accounts.id', onupdate='CASCADE', ondelete='CASCADE'), nullable=False)
    account = relationship('Account', backref=backref('questions'))

我有一个方法,从提供的问题ID返回json格式的问题。 当方法如下所示时,它只会返回问题的id contentaccount_id

    @expose('json')
    def question(self, question_id):
        return dict(questions=DBSession.query(Question).filter(Question.id == question_id).one())

但我需要将Account的user_name也包含在json响应中。奇怪的事情(至少对我而言)是我必须明确地告诉方法查询结果包含与帐户的关系,这样帐户信息将包含在json响应中:我的意思是做这样的事情

    @expose('json')
    def question(self, question_id):
        result = DBSession.query(Question).filter(Question.id == question_id).one()
        weird_variable = result.account.user_name
        return dict(question=result)

为什么我要做这样的事情?这背后的原因是什么?

1 个答案:

答案 0 :(得分:2)

来自Relationship Loading Techniques

  

默认情况下,所有对象间关系都是延迟加载

换句话说,在其默认配置中,当您获取Question时,帐户关系实际上并未加载帐户数据,但是当您访问“{1}}属性时account个实例。可以控制此行为:

Question

添加from sqlalchemy.orm import joinedload DBSession.query(Question).\ filter(Question.id == question_id).\ options(joinedload('account')).\ one() 选项指示查询使用连接同时加载父关系。其他急切加载技术也可用,它们在"What Kind of Loading to Use?"

下讨论了可能的用例和权衡