【问题标题】:Problems eagerloading a set of object using SQLAlchemy使用 SQLAlchemy 急切加载一组对象的问题
【发布时间】:2010-10-27 11:31:46
【问题描述】:

我正在使用 Turbogears2 和 SQLAlchemy 开发一个 web 应用程序。我有两个映射表 O1 和 O2。 O2 在“ones”中有一个 O1 的排序列表。 在某些时候,我想查询所有 O2 和引用的 O1。

很遗憾,下面的查询失败了,因为表 O2 在查询中具有别名,并且 order_by 短语引用的列不再已知。

我想知道如何解决这个问题,同时尽可能保持声明式语法。

base = declarative_base()

class O1(base):
    __tablename__ = 'O1'
    value = Column(Integer)
    o2_id = Column(Integer, ForeignKey('O1.id')) # The culprit

class O2(base):
    __tablename__ = 'O2'
    id = Column(Integer, primary_key=True)
    ones = relation('O1', order_by = ['O1.value'])


Session.query(O2).options(eagerload('ones')).all() # Throws an error

【问题讨论】:

    标签: python orm sqlalchemy


    【解决方案1】:

    使用子句元素的 lambda 来实现 order by 的后期绑定,如下所示:

    ones = relation('O1', order_by=lambda:[O1.value])
    

    或者作为另一种选择,将整个 order_by 设为一个字符串,如下所示:

    ones = relation('O1', order_by='O1.value, O1.something_else')
    

    【讨论】:

    • 谢谢。两种解决方案都有效。我会用第二个。一个添加是因为它是模棱两可的:使用字符串时,您必须使用映射器名称。第二个示例中的“O1”实际上是指类,而不是表名。
    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 2017-09-15
    • 2014-07-29
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多