我正在编写一个Flask / SQLAlchemy应用程序,其中包含用户和组。
用户可以属于多个群组,每个群组中都有唯一的号码。 Asking about how to model the database我被建议使用以下表格结构来表达我的多对多关系:
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如何做这样的事情有什么好的例子或解释吗?
答案 0 :(得分:7)
问题的第一部分(关于创建具有多列的唯一约束)已经answered by cleg。
但是,如果要在映射表中另外添加列,则默认的多对多方法不起作用。相反,您应该使用Association Object Pattern。此外,您可以使用association_proxy简化用户和组之间的访问。
proxied_association.py
中的SQLAlchemy examples应该是一个很好的起点。
答案 1 :(得分:5)
在模型中使用UniqueConstraint
。详细介绍了这个问题:sqlalchemy unique across multiple columns
对于多对多关系,SQLAlchemy有pretty good tutorial。
P.S。对不起,我错过了第二部分答案(这比我想的要复杂得多,所以请看@schlamar的答案),但第一部分仍然是正确的。