py.lib

Yohn Y. 2021-06-06 Parent:10227cc154fa Child:26a5160d6b6b

18:a8460893606a Browse Files

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

db/pg.py db/pg/psy.py db/pg/py.py

     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 +
     2.1 --- a/db/pg/psy.py	Sun Feb 21 17:40:03 2021 +0300
     2.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.3 @@ -1,69 +0,0 @@
     2.4 -# -*- coding: utf-8 -*-
     2.5 -import psycopg2
     2.6 -from psycopg2 import Error as DBError, Warning, DataError, IntegrityError, ProgrammingError
     2.7 -# DBError: Клас-родитель для всех ошибок
     2.8 -# DataError: Проблема с данными (деление на ноль, численное изначение за областью значение и пр.)
     2.9 -# IntegrityError: задеты ограничения целостности БД (уникольность, внешние ключи и пр.)
    2.10 -# ProgrammingError: ошибки в запросах (таблица не найдена, или уже существует, ошибка в синтаксисе запроса и пр.)
    2.11 -
    2.12 -import psycopg2.extensions
    2.13 -psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
    2.14 -psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
    2.15 -
    2.16 -class Error(Exception): pass
    2.17 -
    2.18 -
    2.19 -def dbFactory(**kva):
    2.20 -	""" Фабрика объектов	
    2.21 -	"""
    2.22 -	def _func():
    2.23 -		return DB(**kva)
    2.24 -	return _func
    2.25 -
    2.26 -class DB(object):
    2.27 -	def __init__(self, **kva):
    2.28 -		self._conn = psycopg2.connect(**kva)
    2.29 -		self.commit = self._conn.commit
    2.30 -		self.rollback = self._conn.rollback
    2.31 -		self.cursor = self._conn.cursor
    2.32 -		self.reset = self._conn.reset
    2.33 -	
    2.34 -	def __enter__(self, *a, **kva):
    2.35 -		return self._conn.__enter__(*a, **kva)
    2.36 -		
    2.37 -	def __exit__(self, *a, **kva):
    2.38 -		return self._conn.__exit__(*a, **kva)
    2.39 -	
    2.40 -	def __call__(self, *a, **kva):
    2.41 -		_cur = self.cursor()
    2.42 -		_cur.execute(*a, **kva)
    2.43 -		return _cur
    2.44 -		
    2.45 -	def cq(self, *a, **kva):
    2.46 -		try:
    2.47 -			_cur = self.cursor()
    2.48 -			_cur.execute(*a, **kva)
    2.49 -			self.commit()
    2.50 -			return _cur
    2.51 -		except Exception as e:
    2.52 -			self.rollback()
    2.53 -			raise e
    2.54 -			
    2.55 -	def close(self):
    2.56 -		try:
    2.57 -			self.rollback()
    2.58 -			self._conn.close()
    2.59 -		except:
    2.60 -			pass		
    2.61 -	
    2.62 -	def __del__(self):
    2.63 -		self.close()
    2.64 -	
    2.65 -	def __repr__(self):
    2.66 -		return 'DB(%s)' % self._conn.dsn
    2.67 -		
    2.68 -	
    2.69 -		
    2.70 -		
    2.71 -
    2.72 -
     3.1 --- a/db/pg/py.py	Sun Feb 21 17:40:03 2021 +0300
     3.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.3 @@ -1,31 +0,0 @@
     3.4 -import postgresql.driver as DBM
     3.5 -import postgresql.exceptions as DBErr
     3.6 -
     3.7 -def GetDB(*, name, user, passwd, host='localhost', port=5432):
     3.8 -  """
     3.9 -  На случай когда лениво каждый раз вызывать базу со всеми регалиями,
    3.10 -  регалии сохраняем в специального вызывателя :)))
    3.11 -  """
    3.12 -  def func ():
    3.13 -    return DB(name, user, passwd, host=host, port=port)
    3.14 -  return func
    3.15 -
    3.16 -class DB:
    3.17 -  def __init__(self, db_name, db_user, db_passwd, *, host='localhost', port=5432):
    3.18 -    self._db = DBM.connect(
    3.19 -      host = host,
    3.20 -      port = port,
    3.21 -      user = db_user,
    3.22 -      password = db_passwd,
    3.23 -      database = db_name
    3.24 -    )
    3.25 -    self.xact = self._db.xact
    3.26 -    self.q = self._db.query
    3.27 -    self.pq = self._db.prepare
    3.28 -    self.ex = self._db.execute
    3.29 -    self.proc = self._db.proc
    3.30 -    self.close = self._db.close
    3.31 -  
    3.32 -  def __del__(self):
    3.33 -    if self._db.state != 'closed':
    3.34 -      self._db.close()
    3.35 \ No newline at end of file