SQLAlchemyのback_populatesとbackref

with コメントはまだありません

SQLAlchemyのback_populatesとbackrefって何がどう違うの?っていうかどっちも書かないとどうなるの?という疑問に対する答え。

結論から書くと、

(1)backrefを使用した場合
双方向のリレーションを自動的に組んでくれる。

(2)back_populatesを使用した場合
双方向のリレーションを自分で組む必要がある。

(3)back_populatesもbackrefも使用しない場合
トランザクション中、逆方向のフィールドが自動更新されない。

ということになる。

では、具体例を見ていく。
例としてEventモデルとTicketモデルを考える。
1つのEventは複数のTicketをもっている、One to Manyの関係。

backrefを使用した場合

back_populatesを使用した場合

back_populatesを使用する場合は、双方向のリレーションを組まないと動作しない。

どちらも使用しない場合

この場合、ticket→eventがNoneになっている。
つまり、トランザクション内ではticketにeventが紐付いていない事がわかる。
勿論、トランザクション終了後(eventオブジェクトをインサートした後)なら双方向で紐付いている。

Leave a Reply