py.lib
2020-07-24
py.lib/db/pg/psy.py
.. Реструктуризация
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/db/pg/psy.py Fri Jul 24 14:40:37 2020 +0300 1.3 @@ -0,0 +1,69 @@ 1.4 +# -*- coding: utf-8 -*- 1.5 +import psycopg2 1.6 +from psycopg2 import Error as DBError, Warning, DataError, IntegrityError, ProgrammingError 1.7 +# DBError: Клас-родитель для всех ошибок 1.8 +# DataError: Проблема с данными (деление на ноль, численное изначение за областью значение и пр.) 1.9 +# IntegrityError: задеты ограничения целостности БД (уникольность, внешние ключи и пр.) 1.10 +# ProgrammingError: ошибки в запросах (таблица не найдена, или уже существует, ошибка в синтаксисе запроса и пр.) 1.11 + 1.12 +import psycopg2.extensions 1.13 +psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) 1.14 +psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY) 1.15 + 1.16 +class Error(Exception): pass 1.17 + 1.18 + 1.19 +def dbFactory(**kva): 1.20 + """ Фабрика объектов 1.21 + """ 1.22 + def _func(): 1.23 + return DB(**kva) 1.24 + return _func 1.25 + 1.26 +class DB(object): 1.27 + def __init__(self, **kva): 1.28 + self._conn = psycopg2.connect(**kva) 1.29 + self.commit = self._conn.commit 1.30 + self.rollback = self._conn.rollback 1.31 + self.cursor = self._conn.cursor 1.32 + self.reset = self._conn.reset 1.33 + 1.34 + def __enter__(self, *a, **kva): 1.35 + return self._conn.__enter__(*a, **kva) 1.36 + 1.37 + def __exit__(self, *a, **kva): 1.38 + return self._conn.__exit__(*a, **kva) 1.39 + 1.40 + def __call__(self, *a, **kva): 1.41 + _cur = self.cursor() 1.42 + _cur.execute(*a, **kva) 1.43 + return _cur 1.44 + 1.45 + def cq(self, *a, **kva): 1.46 + try: 1.47 + _cur = self.cursor() 1.48 + _cur.execute(*a, **kva) 1.49 + self.commit() 1.50 + return _cur 1.51 + except Exception as e: 1.52 + self.rollback() 1.53 + raise e 1.54 + 1.55 + def close(self): 1.56 + try: 1.57 + self.rollback() 1.58 + self._conn.close() 1.59 + except: 1.60 + pass 1.61 + 1.62 + def __del__(self): 1.63 + self.close() 1.64 + 1.65 + def __repr__(self): 1.66 + return 'DB(%s)' % self._conn.dsn 1.67 + 1.68 + 1.69 + 1.70 + 1.71 + 1.72 +