SQLAlchemy вызывает IntegrityError
как для нарушения ограничений, так и для внешних ключей. Как я могу обернуть это в блоке try/except
и различать различные причины исключения? Я хочу знать, в каком столбце произошло нарушение, независимо от того, было ли оно уникальным или нарушением ключа Foriegn.SQLAlchemy - Try За исключением различных ошибок целостности
Возьмите этот класс, например.
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) не выполнено.
Я полагаю, что я мог бы разобрать «уникальное» и имя столбца в th е 1-й случай. Во втором случае я мог разобрать «внешний ключ», но я не смог получить имя столбца. Если в таблице есть несколько внешних ключей, как я могу определить, где произошло нарушение, не делая другого вызова для каждой родительской таблицы?
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, которая может содержать затронутый столбец, в зависимости от бэкэнд. – univerio