py.lib

Yohn Y. 2020-11-07 Parent:cab7fedf8432

15:f3e62028e5d3 Go to Latest

py.lib/db/pg/psy.py

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

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