Python 在SQLAlchemy中的多个列上创建约束
我有一个MySQL表,用于管理以下模型描述的城市中的建筑入口方法: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) 在一座建筑物里,一个人可以有许多卡片,可以用来
类方法(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,我编辑了这个问题,请看一看你的表达是如此清晰和正确我的意思。我想它会部分解决我的问题,我会试穿它,所以我给你们投票。谢谢