代码之家  ›  专栏  ›  技术社区  ›  Marian

sqlAlchemy-关系仅限于外键

  •  4
  • Marian  · 技术社区  · 16 年前

    我有一个wiki数据库布局 Page Revisions . 每个版本都有一个 page_id 引用页面,a 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:无法确定PrimaryJoin条件的关系方向…。` 我已经尽力了,但没用。

    我做错什么了?这是不是一个不好的方法,除了一段关系,怎么能做到呢?

    1 回复  |  直到 16 年前
        1
  •  4
  •   Denis Otkidach    16 年前

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

    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 . 使用字符串 基本连接 工作精细:

    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,
        )
    
    推荐文章