【问题标题】:Create a constraint on multiple columns in SQLAlchemy在 SQLAlchemy 中的多列上创建约束
【发布时间】:2021-04-29 04:09:15
【问题描述】:

我有一个 MySQL 表,用于管理由以下模型描述的城市中的建筑物入口方法:

class EntranceMethod(db.Model):
    id = Column(String, primary_key=True)
    building_id = ForeignKey('building.id', nullable=False)
    user_id = ForeignKey('user.id', nullable=False)
    card_name = Column(String, nullable=False)
    gate = Column(Enum('A', 'B', 'C'), nullable=False) 

在一座建筑物中,一个人可以有很多张卡片,这些卡片可以用来识别他们并允许他们通过某些大门。但是,这些卡也可以用于其他建筑物。

在建筑范围内,我想确保:

  • 使用特定门,用户不能使用超过 1 张卡进入。 (他们可以通过这张卡进入其他大门的建筑物,但不能在该大门使用另一张卡)。

所以我创建了一个独特的约束:(building_id, user_id, gate)

  • 一张卡只属于一位用户。

我应该做什么样的限制?我想到了building_idcard_namegate 的唯一约束将解决问题,但它只是说,'这张卡只能由一个用户在每个门上使用' .情况下,用户U在A门使用卡K,用户V在B门使用卡K,还是可以的。

例如,我有一些记录(一个建筑范围):

user_id card_name gate
user1 card1-1 A
user1 card1-2 B
user2 card2-1 C
user2 card1-1 B

唯一约束(buildinguser_idgate)已满足,但名为 card1-1 的卡属于 2 个用户。

【问题讨论】:

  • (building_id, user_id, gate) 上的唯一约束如何无法达到预期的结果?请edit 您的问题包括minimal reproducible example 与样本数据和结果。
  • @GordThompson 这个独特的约束使我的表满足第一个条件,但不是第二个条件。

标签: python mysql flask-sqlalchemy


【解决方案1】:

您的约束(building_id, user_id, gate) 意味着给定用户的入口方法的唯一性。 口头上的意思是

“一个用户在建筑物的大门上不能有多个入口方法”

“建筑物中的一个门不能有超过一种进入单个用户的方式”

由于您没有以任何方式处理卡的唯一性,因此不可能暗示 User1 不会与 User2 拥有相同的卡。但是,您的主要条件仍将满足 - 一位用户将只能使用一张卡(无论您将在 EntranceMethodcard 字段中输入的任何文本)通过。

由于每个用户只有一个入口方法,因此对于给定的Userbuilding_idgate,不会有重复的 card 字段。

如果您还想确保用户不会分享他们的卡片进入,您可以引入Card 模型,以及ForeignKeyUser 模型。这样,一个卡片实例将只附加到一个User

但是,此方法意味着您必须在创建时验证 EntranceMethod - 另外检查 card_id 是否是用户的卡片之一。

【讨论】:

  • 我已经创建了一个UniqueConstraint('building_id', 'user_id', 'gate')。但主要问题是如何使一对值(building_id,card)只与一个 user_id 值一起使用。
  • @Goomoonryong,我编辑了问题,请看一下
  • 你的表达是如此清晰和正确,我的意思。我认为它会部分解决我的问题,我会尝试一下,所以我给你一个赞成票。谢谢。
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2012-07-07
相关资源
最近更新 更多