自己参照のrelation @ sqlalchemy 0.5

written by shn, on Apr 13, 2009 12:31:00 PM.

自己参照型の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として関係が作れないかはわからず…

Comments

  • 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はソースが追いづらいので勉強になりました。

    1. あと、コメントの整形をどうにかしないと…

    Comment by shn — May 21, 2009 4:25:45 PM | # - re

Leave a Reply