py.lib

Yohn Y. 2021-06-06 Parent:db/pg/psy.py@cab7fedf8432 Child:1a3d395b5cdf

18:a8460893606a Go to Latest

py.lib/db/pg.py

. Наведение порядка с PostgreSQL

History
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/db/pg.py	Sun Jun 06 14:04:19 2021 +0300
     1.3 @@ -0,0 +1,64 @@
     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 +
    1.17 +class Error(Exception):
    1.18 +	pass
    1.19 +
    1.20 +
    1.21 +class DB(object):
    1.22 +	def __init__(self, **kva):
    1.23 +		self._conn = psycopg2.connect(**kva)
    1.24 +		self.commit = self._conn.commit
    1.25 +		self.rollback = self._conn.rollback
    1.26 +		self.cursor = self._conn.cursor
    1.27 +		self.reset = self._conn.reset
    1.28 +	
    1.29 +	def __enter__(self, *a, **kva):
    1.30 +		return self._conn.__enter__(*a, **kva)
    1.31 +		
    1.32 +	def __exit__(self, *a, **kva):
    1.33 +		return self._conn.__exit__(*a, **kva)
    1.34 +	
    1.35 +	def __call__(self, *a, **kva):
    1.36 +		_cur = self.cursor()
    1.37 +		_cur.execute(*a, **kva)
    1.38 +		return _cur
    1.39 +		
    1.40 +	def cq(self, *a, **kva):
    1.41 +		try:
    1.42 +			_cur = self.cursor()
    1.43 +			_cur.execute(*a, **kva)
    1.44 +			self.commit()
    1.45 +			return _cur
    1.46 +		except Exception as e:
    1.47 +			self.rollback()
    1.48 +			raise e
    1.49 +			
    1.50 +	def close(self):
    1.51 +		try:
    1.52 +			self.rollback()
    1.53 +			self._conn.close()
    1.54 +		except:
    1.55 +			pass		
    1.56 +	
    1.57 +	def __del__(self):
    1.58 +		self.close()
    1.59 +	
    1.60 +	def __repr__(self):
    1.61 +		return 'DB(%s)' % self._conn.dsn
    1.62 +		
    1.63 +	
    1.64 +		
    1.65 +		
    1.66 +
    1.67 +