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 方面没有太多经验,所以这可能很明显,但我找不到表达它的方法。

我没有得到的事情是:使用常规的多对多关系,我的User班级有一个类似列表的属性groups,其中包含他所属的所有组,但这完全隐藏了UserGroups连接表,我没有不知道如何访问该UserNumber字段。

这对我来说有点模糊。关于如何使用 SQLAlchemy 做这样的事情,你有什么好的例子或解释吗?

4

2 回答 2

13

cleg已经回答了问题的第一部分(关于创建具有多列的唯一约束)。

但是,如果您想在映射表中添加额外的列,则默认的多对多方法不起作用。相反,您应该使用关联对象模式此外,您可以使用association_proxy简化用户和组之间的访问。

proxied_association.py来自SQLAlchemy 的示例应该是一个很好的起点。

于 2013-01-16T11:31:31.970 回答
8

UniqueConstraint在您的模型中使用。详细描述了这个问题:sqlalchemy unique across multiple columns

至于多对多关系,SQLAlchemy 有很好的教程

PS对不起,我错过了答案的第二部分(它比我想象的更复杂,所以请参阅@schlamar的答案),但第一部分仍然是正确的。

于 2013-01-16T09:57:55.153 回答