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