【FastAPI+SQLArchemy】テーブルのリレーションについての注意
昨日なぜか夕方の7時くらいから、朝の5時くらいまで爆睡してしまったので、昨日は何も投稿していない、ちょっとショック・・・
まあ、そんなことは置いておいて
↓の記事でSQLArchemyのORMでリレーション(テーブル間の紐付け)について書いたけど、エラーにどハマりしたことで、一つ注意点が浮かび上がった。
まあ、そんな大した話ではないのですが・・・
【画像処理】UserクラスとFilterSetクラス
下記みたいな感じで、Userごとに、画像処理のフィルタリングセットをもつ実装を想定
class User(Base):
__tablename__ = 'users'
id = Column(String, primary_key=True, index=True, default=generate_uuid())
name = Column(String)
password = Column(String, unique=True)
filtersId = Column(String)
# 今回の注意箇所
filterset = relationship("FilterSet", back_populates="user") # relationshipは、モデル(クラス)名、back_populatesに指定するのは、自分のモデル(クラス)名
def __init__(self, name, password):
self.username = name
self.password = password
# self.active = True
class FilterSet(Base):
__tablename__ = 'filtersets'
id = Column(String, primary_key=True, index=True, default=generate_uuid())
fileters = Column('fileters', String) # Concatenated filter ID
threshold = Column('threshold', Integer)
kernelSize = Column('kernelSize', Integer)
# 今回の注意箇所
userId = Column(String, ForeignKey('users.id')) # ForeignKeyつまり外部キーの指定方法は、'参照テーブル名.カラム[フィールド]名'
user = relationship("User", back_populates="filterset") # relationshipは、モデル(クラス)名、back_populatesに指定するのは、自分のモデル(クラス)名
クラス名(モデル名)とテーブル名ややこしい
ドキュやらなんやらのリーディング能力(読解力)がなさすぎて、めっちゃハマったのでメモしておきます。
エラーの出力についても確かに、DBエンジンが発行するSQLをよく見たら、テーブル名のところにクラス名が入ってしまっていたりしたのですが、そこは、例の如く底辺雑魚エンジニアの私としては、何回読み返しても気づけなかったのは言うまでもない。
とりあえず、今回の気づきを元にまた、自分の認知の枠組み、というか着眼点の一つに、テーブル/クラス名問題を刻み込んでおく。