# pylint: disable=missing-docstring
# pylint: disable=wrong-import-order
import re
import psycopg2
from fictive.sqlalchemy.ext.errors import IntegrityErrorData
[docs]class Psycopg2IntegrityErrorData(IntegrityErrorData):
ERROR_CLASS = psycopg2.errors.IntegrityError
@property
def code(self):
return type(self.integrity_error.orig).__name__
@property
def table(self):
return self.integrity_error.orig.diag.table_name
@property
def message(self):
return self.integrity_error.orig.diag.message_primary
[docs]class Psycopg2NotNullViolationData(Psycopg2IntegrityErrorData):
ERROR_CLASS = psycopg2.errors.NotNullViolation
@property
def fields(self):
return {self.integrity_error.orig.diag.column_name: None}
[docs]class Psycopg2UniqueViolationData(Psycopg2IntegrityErrorData):
ERROR_CLASS = psycopg2.errors.UniqueViolation
FIELDS_RE = re.compile(r'\((?P<keys>.*?)\)=\((?P<values>.*?)\)')
@property
def fields(self):
match = self.FIELDS_RE.search(
self.integrity_error.orig.diag.message_detail)
keys = map(str.strip, match.group('keys').split(','))
values = map(str.strip, match.group('values').split(','))
return dict(zip(keys, values))
[docs]class Psycopg2CheckViolationData(Psycopg2IntegrityErrorData):
ERROR_CLASS = psycopg2.errors.CheckViolation
[docs]class Psycopg2ForeignKeyViolationData(Psycopg2IntegrityErrorData):
ERROR_CLASS = psycopg2.errors.ForeignKeyViolation
FIELDS_RE = re.compile(r'\((?P<keys>.*?)\)=\((?P<values>.*?)\)')
@property
def fields(self):
match = self.FIELDS_RE.search(
self.integrity_error.orig.diag.message_detail)
keys = map(str.strip, match.group('keys').split(','))
values = map(str.strip, match.group('values').split(','))
return dict(zip(keys, values))