【问题标题】:One to one self relationship in SQLAlchemySQLAlchemy中的一对一自我关系
【发布时间】:2012-10-14 02:27:49
【问题描述】:

我需要创建一个链表的 SQLAlchemy 版本。它实际上比这更复杂,但归结为:

我需要一个类中的一对一、自引用、双向关系。每个元素可能只有一个父元素或根本没有父元素,并且最多有一个子元素。

我简化了我的课程,所以它看起来像这样:

class Node(declarative_base()):
    __tablename__ = 'nodes'

    id = Column(Integer, Sequence('nodes_id_seq'), primary_key=True, autoincrement=True)
    value = Column(Integer)
    prev_node_id = Column(Integer, ForeignKey('nodes.id'))
    next = relationship('Node', uselist=False, backref=backref('prev', uselist=False))

但是,当我尝试创建一个时,它会引发异常:

>>> Node()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "<string>", line 2, in __init__
  File "sqlalchemy\orm\instrumentation.py", line 309, in _new_state_if_none
    state = self._state_constructor(instance, self)

[...]

  File "sqlalchemy\orm\properties.py", line 1418, in _generate_backref
    self._add_reverse_property(self.back_populates)
  File "sqlalchemy\orm\properties.py", line 871, in _add_reverse_property
    % (other, self, self.direction))
ArgumentError: Node.next and back-reference Node.prev are both of the same direction <symbol 'ONETOMANY>.  Did you mean to set remote_side on the many-to-one side ?

我在这里缺少什么?谷歌搜索让我一无所获......:/

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    正如例外所说,您需要为关系设置 remote_side 关键字。否则sqlalchemy无法选择参考方向。

    class Node(declarative_base()):
        ...
        prev = relationship(
            'Node',
            uselist=False,
            remote_side=[id],
            backref=backref('next', uselist=False)
        )
    

    【讨论】:

    • 当我的 id 表不在 Node 类中,而是在超类中定义时,如何设置 remote_side?​​span>
    • @user1111652 你可以在类之后声明类似 Node.prev = relationship(..... remote_side=[Node.id] .....)
    • 或者您可以使用带引号的表达式稍后加载(类似于“Node.id”而不是 Node.id)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2020-11-01
    • 2020-11-21
    • 1970-01-01
    • 2016-06-15
    • 2021-08-31
    • 1970-01-01
    相关资源
    最近更新 更多