18

ユーザーとグループを持つ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クラスには、彼が属するすべてのグループを含むリストのような属性がありますが、これにより結合テーブルが完全に隠され、私はそうしませんフィールドへのアクセス方法がわかりません。groupsUserGroupsUserNumber

これは私には少しぼやけています。SQLAlchemy でそのようなことを行う方法について、良い例や説明はありますか?

4

2 に答える 2

13

質問の最初の部分 (複数の列を持つ一意の制約の作成について) は、 cleg によって既に回答されています。

ただし、マッピング テーブルに追加の列が必要な場合、既定の多対多のアプローチは機能しません。代わりに、Association Object Patternを使用する必要があります。さらに、 Association_proxyを使用して、ユーザーとグループ間のアクセスを簡素化できます。

SQLAlchemy の例からproxied_association.py始めるのが良いでしょう。

于 2013-01-16T11:31:31.970 に答える
8

UniqueConstraintモデルで使用します。詳細は、この質問で説明されています: sqlalchemy unique across multiple columns

多対多の関係に関しては、SQLAlchemy にはかなり良いチュートリアルがあります。

PS申し訳ありませんが、回答の2番目の部分を見逃しました(思ったより複雑なので、@schlamarからの回答を参照してください)が、最初の部分はまだ正しいです。

于 2013-01-16T09:57:55.153 に答える