【问题标题】:How to model a `UNIQUE` constraint in SQLAlchemy?如何在 SQLAlchemy 中为“UNIQUE”约束建模?
【发布时间】:2012-12-30 14:24:13
【问题描述】:

我正在编写一个 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 创建常规的多对多关系,但我不知道如何使用附加的 UserNumber 字段来表示 UNIQUE 约束。

我在数据库设计、ORM 和 SQLAlchemy 方面没有太多经验,所以这可能很明显,但我找不到表达方式。

我不明白的是:使用常规的多对多关系,我的 User 类有一个 list-like 属性 groups 包含所有组他属于,但这完全隐藏了UserGroups 加入表,我不知道如何访问UserNumber 字段。

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

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    问题的第一部分(关于创建具有多列的唯一约束)已经是answered by cleg

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

    SQLAlchemy examples 中的proxied_association.py 应该是一个不错的起点。

    【讨论】:

      【解决方案2】:

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

      对于多对多关系,SQLAlchemy 有pretty good tutorial

      附:抱歉,我错过了答案的第二部分(它比我想象的要复杂,所以请参阅@schlamar 的答案),但第一部分仍然是正确的。

      【讨论】:

      • 如果您想在映射表中添加额外的列,默认的多对多方法不起作用。
      • 我在看到@schlamar 之前写了我的答案,但现在添加了一个参考。
      • 这不是repo的问题,只想说实话:)
      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      相关资源
      最近更新 更多