1. ホーム
  2. python

[解決済み] SQLAlchemy で `UNIQUE` 制約をモデル化するには?

2022-02-12 05:22:43

質問

Flask/SQLAlchemyのアプリケーションを書いていて、ユーザーとグループを持っています。

ユーザーは複数のグループに所属することができ 各グループ内で一意の番号を持つ . データベースのモデル化方法についてお伺いします 多対多の関係には、次のようなテーブル構造を使用するようアドバイスを受けました。

TABLE UserGroups
  GroupID 
  UserID
  UserNumber
  PRIMARY KEY (GroupID, UserID)
  UNIQUE (GroupID, UserNumber)
  FOREIGN KEY (GroupID)
    REFERENCES Groups (GroupID)
  FOREIGN KEY (UserID)
    REFERENCES Users (UserID)

SQLAlchemy で通常の多対多のリレーションシップを作る方法はわかりましたが UNIQUE 制約に、さらに UserNumber フィールドを使用します。

データベース設計やORM、SQLAlchemyの経験があまりないので、当たり前のことかもしれませんが、表現方法が見つかりません。

私が理解できないことのひとつは、通常の多対多のリレーションシップを使用して、私の User クラスには リストのような 属性 groups には、彼が所属するすべてのグループが含まれていますが、これは完全に UserGroups にアクセスする方法がわかりません。 UserNumber フィールドがあります。

これだけでは、ちょっとモヤモヤしますよね。SQLAlchemyでこのようなことをする良い例や説明はありますか?

どのように解決するのですか?

質問の最初の部分(複数の列を持つユニークな制約の作成について)は、すでに clegさんが回答しています。 .

しかし、マッピングテーブルに追加のカラムを持ちたい場合、デフォルトの多対多のアプローチはうまくいきません。その代わりに アソシエーションオブジェクトパターン . さらに、ユーザーとグループ間のアクセスを簡素化するために アソシエーションプロクシ .

proxied_association.py から SQLAlchemyの例 を参考にするとよいでしょう。