見出し画像

【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の書き方とかもだいぶ頭から抜けてしまっていたので、なんかしっくりくる資料とか探しつつ、また編集します。

この記事が気に入ったらサポートをしてみませんか?