8

リンクリストのSQLAlchemyバージョンを作成する必要があります。実際にはそれよりも複雑ですが、要約すると次のようになります。

クラス内で1対1の自己参照型の双方向の関係が必要です。すべての要素には、親が1つだけの場合もあれば、まったくない場合もあり、子は1つまでです。

クラスを簡略化したので、次のようになります。

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 ?

ここで何が欠けていますか?グーグル検索は私を絶対にどこにも連れて行かなかった...:/

4

1 に答える 1

13

remote_side例外として、関係のキーワードを設定する必要があります。そうしないと、sqlalchemyは参照方向を選択できません。

class Node(declarative_base()):
    ...
    prev = relationship(
        'Node',
        uselist=False,
        remote_side=[id],
        backref=backref('next', uselist=False)
    )
于 2012-10-13T18:27:49.210 に答える