【问题标题】:slqlachemy joined load by variable declarationsqlalchemy 通过变量声明加入加载
【发布时间】:2016-09-23 21:43:35
【问题描述】:

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

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 格式的问题。 当方法如下所示时,它只返回问题的idcontentaccount_id

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

但我也需要将 Account 的用户名包含在 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)

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

【问题讨论】:

    标签: python sqlalchemy turbogears2


    【解决方案1】:

    来自Relationship Loading Techniques

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

    换句话说,在其默认配置中,关系 account 在您获取 Question 时实际上并不加载帐户数据,而是在您访问 Question 实例的 account 属性时.这种行为是可以控制的:

    from sqlalchemy.orm import joinedload
    
    DBSession.query(Question).\
        filter(Question.id == question_id).\
        options(joinedload('account')).\
        one()
    

    添加joinedload 选项指示查询使用连接同时加载与父级的关系。其他急切加载技术也可用,它们可能的用例和权衡在"What Kind of Loading to Use?" 下讨论

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-16
      • 2011-10-20
      • 2012-08-27
      • 1970-01-01
      • 2020-08-30
      • 2023-02-13
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多