我正在开发一个用于存储和管理任务的Web应用程序,使用Flask-SQLAlchemy与后端通信。我想使用一个表来存储任务对之间的优先级比较,以构造部分排序。该表将具有两列,一列用于较小的元素,一列用于较大的元素,并且这两列将共同构成主键。
到目前为止,我的代码如下所示:
class PriorityPair(db.Model):
lesser_id = db.Column(db.Integer, db.ForeignKey('task.id'),
primary_key=True)
lesser = db.relationship('Task', remote_side=[id])
greater_id = db.Column(db.Integer, db.ForeignKey('task.id'),
primary_key=True)
greater = db.relationship('Task', remote_side=[id])
def __init__(self, lesser, greater):
self.lesser = lesser
self.greater = greater
总而言之,这足以满足我对表的处理需求,但是存在一个问题,即可能会插入不一致的行。假设我有两个任务,A和B。如果任务A的优先级高于任务B,则可以执行以下操作:
pair = PriorityPair(task_b, task_a)
db.session.add(pair)
db.session.commit
两者之间的关系将按需要存储。但是,如果将来PriorityPair(task_a, task_b)
在表中插入相反的关系,那将是不一致的。两个任务的重要性不能同时超过彼此。
现在,我可能可以在python代码中防止出现这种情况,但是我想确保可以保证数据库表本身保持一致。是否可以(通过Flask-SqlAlchemy)在表上放置某种约束,以便如果该约束(A,B)
已经存在,(B,A)
则将被自动拒绝?这样的约束是否可以跨数据库后端使用?
不,不
这不可能。SqlAlchemy支持CHECK约束,但是check的表达式以字符串形式给出。它将需要一个子查询,例如(greater_id, lesser_id) not in (select sub.lesser_id, sub.greater_id from priority_pair as sub)
。基础数据库后端将阻止它:
相反,您必须找到其他解决方案,无论是触发器还是仅更改整个模型,这都是我决定要做的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句