【问题标题】:SQLAlchemy - relationship limited on more than just the foreign keySQLAlchemy - 关系不仅限于外键
【发布时间】:2011-02-25 12:13:13
【问题描述】:

我有一个带有PageRevisions 的wiki 数据库布局。每个修订版都有一个引用页面的page_id,与引用页面的page 关系;每个页面与其所有修订版都有all_revisions 关系。到目前为止很常见。

但我想为页面实现不同的时期:如果一个页面被删除并重新创建,新的修订版有一个新的epoch。为了帮助找到正确的修订,每个页面都有一个current_epoch 字段。现在我想在页面上提供一个revisions 关系,该关系仅包含其修订,但仅包含时代匹配的那些。

这是我尝试过的:

revisions = relationship('Revision',
    primaryjoin = and_(
        'Page.id == Revision.page_id',
        'Page.current_epoch == Revision.epoch',
    ),
    foreign_keys=['Page.id', 'Page.current_epoch']
)

Full code(您可以按原样运行)

但是这总是引发 ArgumentError: Could not determine relationship direction for primaryjoin condition ...`,我已经尝试了所有我想到的,它没有工作。

我做错了什么?这是一种不好的方法吗?除了建立关系之外,还能怎么做?

【问题讨论】:

    标签: python sqlalchemy relationship database


    【解决方案1】:

    在创建两个类后尝试安装关系:

    Page.revisions = relationship(
        'Revision',
        primaryjoin = (Page.id==Revision.page_id) & \
                        (Page.current_epoch==Revision.epoch),
        foreign_keys=[Page.id, Page.current_epoch],
        uselist=True,
    )
    

    顺便说一句,您的测试不正确:revisions 属性在您尚未将它们添加到会话时从数据库加载数据。

    更新:你代码中的问题是primaryjoin参数不是字符串,所以it's not evaluated。在primaryjoin 中使用字符串可以正常工作:

    class Page(Base):
        # [skipped]
        revisions = relationship(
            'Revision',
            primaryjoin = '(Page.id==Revision.page_id) & '\
                            '(Page.current_epoch==Revision.epoch)',
            foreign_keys=[id, current_epoch],
            uselist=True,
        )
    

    【讨论】:

    • 谢谢!做到了。我没有让所有东西都可以在真实的应用程序中工作,但它可以在小演示中工作,所以至少这个特定问题现在已经解决了。 @BTW:啊,忘记了,因为我们有一个特殊的 init 方法可以自动添加。 Updated, working code.
    • 知道为什么之后添加它可以解决这个问题吗?我认为字符串表示法是为了避免这样的事情? (而且,如果不是在创建两个类之后,它什么时候评估这些字符串?)
    • 我在字符串中添加了一个解释和一个正确表达的例子。
    猜你喜欢
    • 2017-05-24
    • 2013-09-19
    • 2012-02-29
    • 2018-03-03
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2021-07-10
    相关资源
    最近更新 更多