Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! coding: utf-8
- import logging
- import psycopg2
- import ORM.settings as settings
- from errors import TableAlreadyExistsException, NoRequestToExecuteException
- from tables import Table
- class Database(object):
- """ Этот класс отражает базу данных """
- def __init__(self):
- self.connection = None
- self.cursor = None
- # здесь хранятся все новоиспеченные (объекты) sql-запросы, кроме запросов на взаимодействие с таблицами
- self.new_requests = []
- # тут хранятся объекты таблиц, которые уже существуют в системе
- self.exist_tables = []
- # тут хранятся таблицы, которые еще не были созданы
- self.new_tables = []
- # соединяется с базой данных
- def connect(self):
- try:
- self.connection = psycopg2.connect(database=settings.PSQL_DBNAME, user=settings.PSQL_USER,
- password=settings.PSQL_PASSWORD)
- self.cursor = self.connection.cursor()
- except psycopg2.Error as e:
- logging.error(str(e.pgerror))
- # сохраняет изменения в базе данных
- def save(self):
- try:
- self.connection.commit()
- except psycopg2.Error as e:
- logging.error(str(e.pgerror))
- # создает таблицу на объектном уровне
- def create_table(self, table_name):
- # если такой таблицы еще не существует
- if len([table for table in self.new_tables if table.name == table_name]) == 0:
- # добавь
- self.new_tables.append(Table(table_name))
- # и верни
- return self.new_tables[len(self.new_tables) - 1]
- else:
- raise TableAlreadyExistsException
- # собирает все подготовленные sql-запросы в одну кучу
- def __collect_sql_requests(self):
- requests = ""
- # запросы на добавление новых таблиц
- for table in self.new_tables:
- requests += table.get_sql_create_request()
- # запросы insert-delete-update
- for request in self.new_requests:
- requests += request.get_sql_request()
- return requests
- # применяет накопившиеся запросы
- def apply(self):
- request = self.__collect_sql_requests()
- if not request:
- raise NoRequestToExecuteException
- try:
- self.cursor.execute(request)
- except psycopg2.Error as e:
- logging.error(str(e.pgerror))
- # обновляем информацию
- self.exist_tables += self.new_tables
- self.new_tables = []
- self.new_requests = []
- # закрывает соединение с базой данных
- def __del__(self):
- try:
- self.cursor.close()
- self.connection.close()
- except psycopg2.Error as e:
- logging.error(str(e.pgerror))
- # TODO: requests + delete functions + VALIDATION
- """
- Контракт создания таблицы следующий:
- 1. Создаем объект базы данных, соединяемся с ней
- 2. Создаем объект таблицы, добавляем нужное количество колонок
- 3. Применяем изменения методом apply - создается и запускается sql-запрос
- 4. Сохраняем изменения функцией save
- """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement