【发布时间】:2016-09-26 23:24:59
【问题描述】:
SQLAlchemy 为唯一约束和外键约束违规引发IntegrityError。如何将其包装在 try/except 块中并区分导致异常的各种原因?我想知道违规发生在哪一列,是唯一违规还是外键违规。
以这门课为例。
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True)
org_id = db.column(db.Integer, db.ForeignKey('company_id')
以下可能导致两种不同消息之一:
- 如果
name不是唯一的,则消息是 (x.IntegrityError) 列名不是唯一的 - 如果
org_id不唯一,则消息为 (x.IntegrityError) 外键约束失败
我想我可以在第一种情况下解析出“唯一”和列名。在第二种情况下,我可以解析出“外键”,但我无法获得列名。如果表上有多个外键,如何在不再次调用每个父表的情况下判断违规发生的位置?
user = User(name='Matthew Moisen', org_id=999)
db.session.add(user)
try:
db.session.commit()
except IntegrityError as ex:
# This gives either:
# (x.IntegrityError) column name is not unique
# (x.IntegrityError) foreign key constraint failed
logger.exception(ex.message)
【问题讨论】:
-
这取决于后端。如果您检查
ex.orig,您可以查看原始 DBAPI 错误,该错误可能包含受影响的列,具体取决于后端。
标签: python sqlalchemy