ユーザーとグループがいる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の経験があまりないので、これは明白かもしれませんが、それを表現する方法を見つけることができません。
取得できないものの1つは、通常の多対多の関係を使用して、私のUser
クラスにlist-like属性groups
には、彼が属するすべてのグループが含まれていますが、これによりUserGroups
結合テーブルが完全に非表示になり、UserNumber
フィールドにアクセスする方法がわかりません。
これは私にとって少しぼやけています。 SQLAlchemyでそのようなことを行う方法についての良い例や説明はありますか?
質問の最初の部分(複数の列を使用した一意の制約の作成について)はすでに clegによって回答済み です。
ただし、マッピングテーブルに列を追加する場合、デフォルトの多対多のアプローチは機能しません。代わりに、 Association Object Pattern を使用する必要があります。さらに、ユーザーとグループ間のアクセスを association_proxy で簡略化できます。
proxied_association.py
SQLAlchemyの例 から始めるのがよいでしょう。
モデルでUniqueConstraint
を使用します。詳細には、この質問で説明されています: sqlalchemy unique multiple multiple columns
多対多の関係については、SQLAlchemyには かなり良いチュートリアル があります。
追伸申し訳ありませんが、私は答えの2番目の部分を逃しました(それは私が思ったよりも複雑なので、@ schlamarからの答えを参照してください)、最初の部分はまだ正しいです。