755 except Exception as ex: |
755 except Exception as ex: |
756 pass |
756 pass |
757 if ex.__class__.__name__ == 'IntegrityError': |
757 if ex.__class__.__name__ == 'IntegrityError': |
758 # need string comparison because of various backends |
758 # need string comparison because of various backends |
759 for arg in ex.args: |
759 for arg in ex.args: |
760 if 'SQL Server' in arg: |
760 # postgres, sqlserver |
761 mo = re.search("'unique_cw_[^ ]+'", arg) |
761 mo = re.search("unique_[a-z0-9]{32}", arg) |
762 else: # postgres |
|
763 mo = re.search('"unique_cw_[^ ]+"', arg) |
|
764 if mo is not None: |
762 if mo is not None: |
765 index_name = mo.group(0)[1:-1] # eat the surrounding " pair |
763 raise UniqueTogetherError(session, cstrname=mo.group(0)) |
766 elements = index_name.split('_cw_')[1:] |
|
767 etype = elements[0] |
|
768 rtypes = elements[1:] |
|
769 raise UniqueTogetherError(etype, rtypes) |
|
770 # sqlite |
764 # sqlite |
771 mo = re.search('columns (.*) are not unique', arg) |
765 mo = re.search('columns (.*) are not unique', arg) |
772 if mo is not None: # sqlite in use |
766 if mo is not None: # sqlite in use |
773 # we left chop the 'cw_' prefix of attribute names |
767 # we left chop the 'cw_' prefix of attribute names |
774 rtypes = [c.strip()[3:] |
768 rtypes = [c.strip()[3:] |
775 for c in mo.group(1).split(',')] |
769 for c in mo.group(1).split(',')] |
776 etype = '???' |
770 raise UniqueTogetherError(session, rtypes=rtypes) |
777 raise UniqueTogetherError(etype, rtypes) |
|
778 raise |
771 raise |
779 return cursor |
772 return cursor |
780 |
773 |
781 def doexecmany(self, session, query, args): |
774 def doexecmany(self, session, query, args): |
782 """Execute a query. |
775 """Execute a query. |