web-dev-qa-db-ja.com

SQLAlchemyで「UNIQUE」制約をモデル化する方法は?

ユーザーとグループがいる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でそのようなことを行う方法についての良い例や説明はありますか?

12
ereOn

質問の最初の部分(複数の列を使用した一意の制約の作成について)はすでに clegによって回答済み です。

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

proxied_association.pySQLAlchemyの例 から始めるのがよいでしょう。

8
schlamar

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

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

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

5
cleg