Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy-关系仅限于外键_Python_Sqlalchemy_Relationship_Database - Fatal编程技术网

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方法,可以自动进行加法。你知道为什么事后添加它可以解决这个问题吗?我以为字符串符号是为了避免这些东西?(如果不是在两个类都创建之后,它什么时候对这些字符串求值呢?)。