見出し画像

【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をよく見たら、テーブル名のところにクラス名が入ってしまっていたりしたのですが、そこは、例の如く底辺雑魚エンジニアの私としては、何回読み返しても気づけなかったのは言うまでもない。

とりあえず、今回の気づきを元にまた、自分の認知の枠組み、というか着眼点の一つに、テーブル/クラス名問題を刻み込んでおく。

いいなと思ったら応援しよう!