自己参照のrelation @ sqlalchemy 0.5
自己参照型のrelationを作ろうとしていて、子供を追加しても「循環参照だ!」って怒られてプチ困った。 マニュアル読んだら答かいてあったよメモ
以下、Adjacency List Relationships - Mapper Configuration からコピペ
親 > 子は普通で良い
mapper(Node, nodes, properties={
'children': relation(Node)
})
子 > 親はremote_sideという引数にカラムを指定する
mapper(Node, nodes, properties={
'children': relation(Node, backref=backref('parent', remote_side=[nodes.c.id]))
})
remote_sideは
used for self-referential relationships, indicates the column or list of columns that form the "remote side" of the relationship.
とのこと。これ以上はコードを追ってないので、なんでこうしないと普通の1:Nとして関係が作れないかはわからず…
mapper(Node, nodes, properties={ 'parent': relation(Node, backref=backref('parent')) }) は分解すると mapper(Node, nodes, properties={ 'children': relation(Node) }) # parent node mapper(Node, nodes, properties={ 'parent': relation(Node) }) # clhild node でrelation名以外は同一の宣言です。 ゆえにnode.parentもtable定義に従って(parent nodeのidではなく)foreignKeyであるparent_idを見にいってしまうのではないでしょうか。 (SQLAでは{relation_name}_idをforeignKeyとするというような事はしない) ピントはずれてたらすみません。
Comment by manjuphobia — Apr 27, 2009 1:23:00 PM | # - re
おお、コメントありがとうございます。 すいません管理画面がspamにまみれてて気がつきませんでした。
あー なるほどそういうことなんですね。SQLAlchemyはソースが追いづらいので勉強になりました。
Comment by shn — May 21, 2009 4:25:45 PM | # - re