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

Python 在SQLAlchemy中的多个列上创建约束,python,mysql,flask-sqlalchemy,Python,Mysql,Flask Sqlalchemy,我有一个MySQL表,用于管理以下模型描述的城市中的建筑入口方法: 类方法(db.Model): id=列(字符串,主键=True) building\u id=ForeignKey('building.id',nullable=False) user\u id=ForeignKey('user.id',nullable=False) 卡片名称=列(字符串,可空=假) gate=Column(枚举('A','B','C'),null=False) 在一座建筑物里,一个人可以有许多卡片,可以用来

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

类方法(db.Model):
id=列(字符串,主键=True)
building\u id=ForeignKey('building.id',nullable=False)
user\u id=ForeignKey('user.id',nullable=False)
卡片名称=列(字符串,可空=假)
gate=Column(枚举('A','B','C'),null=False)
在一座建筑物里,一个人可以有许多卡片,可以用来识别他们,并允许他们通过特定的大门。然而,这些卡也可以在其他建筑中使用

在建筑范围内,我希望确保:

  • 对于特定的门,用户不能使用超过1张卡进入。(他们可以通过此卡从其他大门进入建筑物,但不能在此大门使用其他卡)
因此,我创建了一个独特的约束:(
建筑id
用户id
大门

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

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

用户id 卡号 大门 用户1 卡片1-1 A. 用户1 卡片1-2 B 用户2 卡片2-1 C 用户2 卡片1-1 B 您的约束
(建筑id、用户id、大门)
意味着给定用户的入口方法的唯一性。 口头上,它意味着

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

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

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

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

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


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

对(建筑id、用户id、大门)的唯一约束如何无法达到预期的结果?请将您的问题包含在示例数据和结果中。@GordThompson该唯一约束使我的表可以验证第一个条件,但不能验证第二个条件。我已经创建了一个
UniqueConstraint('building\u id','user\u id','gate')
。但是主要的问题是如何使一对值(building_id,card)只与一个user_id值匹配。@Goomoonryong,我编辑了这个问题,请看一看你的表达是如此清晰和正确我的意思。我想它会部分解决我的问题,我会试穿它,所以我给你们投票。谢谢