py.lib

Yohn Y. 2020-07-24

13:cab7fedf8432 Go to Latest

py.lib/db/pg/psy.py

.. Реструктуризация

History
     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 +