简体   繁体   中英

How to model a `UNIQUE` constraint in SQLAlchemy?

I am writing a Flask/SQLAlchemy application in which I have users and groups.

Users can belong to several groups, and they have a unique number within each group . Asking about how to model the database I was advised to use the following table structure for my many-to-many relationship:

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

Now I know how to create a regular many-to-many relationship with SQLAlchemy, but I don't know how to represent the UNIQUE constraint with the additional UserNumber field.

I don't have a lot of experience with database design, ORMs and SQLAlchemy, so this may be obvious, but I can't find a way to express it.

On of the things I don't get is: using a regular many-to-many relationship, my User class has a list-like attribute groups which contains all the groups he belongs to, but this completely hides the UserGroups joining-table and I don't know how to access the UserNumber field.

This is all a bit blur to me. Do you have any good example or explanations on how-to do such a thing with SQLAlchemy ?

The first part of the question (about creating a unique constraint with multiple columns) is already answered by cleg .

However, the default many-to-many approach doesn't work if you want to have additionally columns in the mapping table. Instead, you should use the Association Object Pattern . Additionally, you can simplify the access between user and group with an association_proxy .

The proxied_association.py from the SQLAlchemy examples should be a good place to start.

Use UniqueConstraint in your model. In detailed it's described in this question: sqlalchemy unique across multiple columns

As for many-to-many relations, SQLAlchemy have pretty good tutorial .

PS Sorry, I've missed with second part of answer (it's more complex then I've thought, so see answer from @schlamar), but first part is still correct.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM