4

とを使用したwikiデータベースレイアウトがPageありRevisionsます。各リビジョンには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']
)

完全なコード(そのまま実行できます)

ただし、これは常にArgumentErrorを発生させます。primaryjoin条件の関係の方向を判別できませんでした... `、思いついたすべてを試しましたが、機能しませんでした。

私は何が間違っているのですか?これはこれを行うための悪いアプローチですか、関係以外でどのように行うことができますか?

4

1 に答える 1

4

両方のクラスが作成された後、リレーションシップをインストールしてみてください。

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パラメーターが文字列ではないため、評価されないことです。で文字列を使用すると正常に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,
    )
于 2010-05-31T08:39:54.710 に答える