py.lib

Yohn Y. 2020-11-07 Parent:cab7fedf8432

15:f3e62028e5d3 Go to Latest

py.lib/db/pg/psy.py

* Поддержка ограничений целостности по-умолчанию

History
awgur@13 1 # -*- coding: utf-8 -*-
awgur@13 2 import psycopg2
awgur@13 3 from psycopg2 import Error as DBError, Warning, DataError, IntegrityError, ProgrammingError
awgur@13 4 # DBError: Клас-родитель для всех ошибок
awgur@13 5 # DataError: Проблема с данными (деление на ноль, численное изначение за областью значение и пр.)
awgur@13 6 # IntegrityError: задеты ограничения целостности БД (уникольность, внешние ключи и пр.)
awgur@13 7 # ProgrammingError: ошибки в запросах (таблица не найдена, или уже существует, ошибка в синтаксисе запроса и пр.)
awgur@13 8
awgur@13 9 import psycopg2.extensions
awgur@13 10 psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
awgur@13 11 psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
awgur@13 12
awgur@13 13 class Error(Exception): pass
awgur@13 14
awgur@13 15
awgur@13 16 def dbFactory(**kva):
awgur@13 17 """ Фабрика объектов
awgur@13 18 """
awgur@13 19 def _func():
awgur@13 20 return DB(**kva)
awgur@13 21 return _func
awgur@13 22
awgur@13 23 class DB(object):
awgur@13 24 def __init__(self, **kva):
awgur@13 25 self._conn = psycopg2.connect(**kva)
awgur@13 26 self.commit = self._conn.commit
awgur@13 27 self.rollback = self._conn.rollback
awgur@13 28 self.cursor = self._conn.cursor
awgur@13 29 self.reset = self._conn.reset
awgur@13 30
awgur@13 31 def __enter__(self, *a, **kva):
awgur@13 32 return self._conn.__enter__(*a, **kva)
awgur@13 33
awgur@13 34 def __exit__(self, *a, **kva):
awgur@13 35 return self._conn.__exit__(*a, **kva)
awgur@13 36
awgur@13 37 def __call__(self, *a, **kva):
awgur@13 38 _cur = self.cursor()
awgur@13 39 _cur.execute(*a, **kva)
awgur@13 40 return _cur
awgur@13 41
awgur@13 42 def cq(self, *a, **kva):
awgur@13 43 try:
awgur@13 44 _cur = self.cursor()
awgur@13 45 _cur.execute(*a, **kva)
awgur@13 46 self.commit()
awgur@13 47 return _cur
awgur@13 48 except Exception as e:
awgur@13 49 self.rollback()
awgur@13 50 raise e
awgur@13 51
awgur@13 52 def close(self):
awgur@13 53 try:
awgur@13 54 self.rollback()
awgur@13 55 self._conn.close()
awgur@13 56 except:
awgur@13 57 pass
awgur@13 58
awgur@13 59 def __del__(self):
awgur@13 60 self.close()
awgur@13 61
awgur@13 62 def __repr__(self):
awgur@13 63 return 'DB(%s)' % self._conn.dsn
awgur@13 64
awgur@13 65
awgur@13 66
awgur@13 67
awgur@13 68
awgur@13 69