Python SQLAlchemy-关系仅限于外键
我有一个带有Python SQLAlchemy-关系仅限于外键,python,sqlalchemy,relationship,database,Python,Sqlalchemy,Relationship,Database,我有一个带有页面和修订版的wiki数据库布局。每个版本都有一个引用页面的page\u id,一个与引用页面的page关系;每个页面都有一个与其所有修订的所有修订关系。到目前为止,这很普遍 但是我想为页面实现不同的纪元:如果一个页面被删除并被重新创建,新的修订版将有一个新的纪元。为了帮助找到正确的修订,每页都有一个current\u epoch字段。现在,我想在页面上提供一个revisions关系,该关系只包含其修订,但只包含与时代匹配的修订 这就是我尝试过的: revisions = relat
页面
和修订版
的wiki数据库布局。每个版本都有一个引用页面的page\u id
,一个与引用页面的page
关系;每个页面都有一个与其所有修订的所有修订关系。到目前为止,这很普遍
但是我想为页面实现不同的纪元:如果一个页面被删除并被重新创建,新的修订版将有一个新的纪元。为了帮助找到正确的修订,每页都有一个current\u 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条件的关系方向…`,我已经尝试了我想到的所有方法,但都不起作用
我做错了什么?这是一种不好的方法吗?除了使用关系之外,如何进行此操作?在创建两个类后尝试安装关系:
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
property从数据库加载数据,而您尚未将它们添加到会话中
Update:代码中的问题是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,
)
谢谢成功了。我并没有让所有的东西都在真正的应用程序中工作,但它在小演示中工作,所以至少这个特定的问题现在已经解决了@顺便说一句:啊,忘了这一点,因为我们有一个特殊的init方法,可以自动进行加法。你知道为什么事后添加它可以解决这个问题吗?我以为字符串符号是为了避免这些东西?(如果不是在两个类都创建之后,它什么时候对这些字符串求值呢?)。