py.lib
2020-12-25
Parent:cab7fedf8432
py.lib/db/pg/psy.py
+ Добавления инструмента миграций
| 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 |