2012-10-13 67 views
2

我需要創建鏈表的SQLAlchemy版本。它實際上比這更復雜,但它歸結爲: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 ? 

缺少什麼我在這裏?谷歌搜索讓我絕對無處...:/

回答

7

作爲例外說你需要爲關係設置remote_side關鍵字。否則,sqlalchemy無法選擇參考方向。

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

當我的id表沒有在類Node中定義但是在超類中時,如何設置remote_side? – user1111652

+0

@ user1111652你可以在類之後聲明類似Node.prev = relationship(..... remote_side = [Node.id] .....) –

+0

或者你可以使用帶引號的表達式來加載(類似於「 Node.id「而不是Node.id) –

相關問題