如何在SQLAlchemy中建模`UNIQUE`约束?

时间:2013-01-16 09:51:35

标签: python database sqlalchemy flask flask-sqlalchemy

我正在编写一个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如何做这样的事情有什么好的例子或解释吗?

2 个答案:

答案 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的答案),但第一部分仍然是正确的。