在SQLAlchemy中的多个列上创建约束

2024-09-28 21:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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_iduser_idgate

  • 一张卡只属于一个用户

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

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

^{tb1}$

唯一约束(buildinguser_idgate)已被简化,但名为card1-1的卡属于2个用户


Tags: 用户nameidfalsestringcolumncardbuilding
1条回答
网友
1楼 · 发布于 2024-09-28 21:25:46

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

“一个用户不能有一个以上的入口方式进入建筑物的大门”

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

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

因为每个用户只有一个入口方法,所以给定的Userbuilding_idgate不会有重复的card字段

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

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

相关问题 更多 >