py.lib
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@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 |
| 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@13 | 32 return _cur |
| awgur@13 | 33 |
| awgur@13 | 34 def cq(self, *a, **kva): |
| awgur@13 | 35 try: |
| awgur@13 | 36 _cur = self.cursor() |
| awgur@13 | 37 _cur.execute(*a, **kva) |
| awgur@13 | 38 self.commit() |
| awgur@13 | 39 return _cur |
| awgur@13 | 40 except Exception as e: |
| awgur@13 | 41 self.rollback() |
| awgur@13 | 42 raise e |
| awgur@13 | 43 |
| awgur@13 | 44 def close(self): |
| awgur@13 | 45 try: |
| awgur@13 | 46 self.rollback() |
| awgur@13 | 47 self._conn.close() |
| awgur@13 | 48 except: |
| awgur@13 | 49 pass |
| awgur@13 | 50 |
| awgur@13 | 51 def __del__(self): |
| awgur@13 | 52 self.close() |
| awgur@13 | 53 |
| awgur@13 | 54 def __repr__(self): |
| awgur@13 | 55 return 'DB(%s)' % self._conn.dsn |
| awgur@13 | 56 |
| awgur@13 | 57 |
| awgur@13 | 58 |
| awgur@13 | 59 |
| awgur@13 | 60 |
| awgur@13 | 61 |