【FastAPI+SQLArchemy】relationship()について【メモ】
※前提として(割と知られているかもしれないが、一応)・・・RDBにおけるリレーションとは、テーブルとテーブルの関係のことを言う
SQLArchemyでテーブル間のリレーションを扱う
relationship()は、下記のように扱う
子属性 = relationship("子テーブル")
子テーブルというのは、参照する側のテーブルであり、対応するのはもちろん参照される親テーブルである。
つまり、上記のrelationship()は、親のテーブルにORMで対応させるモデル内に記述する。親側で、このリレーション先(参照する子テーブル)に対して、back refarenceとして、自身(親)のテーブル名を渡すことで、双方向のリレーションが確立される、、、
公式だと下記のUserモデル(userテーブル)とAddressモデル(addressテーブル)とのリレーションを例に取り上げている。
from sqlalchemy import Integer, ForeignKey, String, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
Base = declarative_base()
# 親
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
addresses = relationship("Address", backref="user") # Addressモデル(adressテーブル)を子として参照する、子はuser(親)テーブルに紐づく
# 子
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
email = Column(String)
user_id = Column(Integer, ForeignKey('user.id')) # 親のuserIDと紐づく(userID毎に対応するレコード)
Userが親、Addressが子である。
relationshipの引数のbackrefは、back_populatesでも同様に紐づけれられるらしいが、こちらは、子側でも手動で定義しないと、双方向リレーションが確立できない、という感じに理解している。
他参考
子テーブル、親テーブルについて
※まだ理解が浅いので、理解の誤りや書いている内容に間違いがあったら都度修正します
今後の課題
昔仕事の関係で、DB周りとSQLを勉強してから久しく立っているが、やっぱり付け焼き刃でやっていた内容は、なかなか定着していないようだ。
DB構築(テーブル定義、設計、リレーションの組み方)やSQLの集合演算周りや論理性(真偽値が真のもののみの集合である)とか、概念部分も、SQLの書き方とかもだいぶ頭から抜けてしまっていたので、なんかしっくりくる資料とか探しつつ、また編集します。
この記事が気に入ったらサポートをしてみませんか?