From f65d76757abf49d140363b841e9501955f6e018b Mon Sep 17 00:00:00 2001 From: Anton Kamalov Date: Thu, 14 Nov 2024 15:13:57 +0300 Subject: [PATCH] db module for requests --- App/Requests/db/DBconnect.py | 34 +++++++++++++++++++++++++++++++++ App/Requests/db/__init__.py | 0 App/Requests/db/select.py | 12 ++++++++++++ App/Requests/db/sql_provider.py | 14 ++++++++++++++ App/Requests/requests_model.py | 4 ++-- 5 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 App/Requests/db/DBconnect.py create mode 100644 App/Requests/db/__init__.py create mode 100644 App/Requests/db/select.py create mode 100644 App/Requests/db/sql_provider.py diff --git a/App/Requests/db/DBconnect.py b/App/Requests/db/DBconnect.py new file mode 100644 index 0000000..b335654 --- /dev/null +++ b/App/Requests/db/DBconnect.py @@ -0,0 +1,34 @@ +import pymysql +from pymysql.err import * +class DBContextManager: + def __init__(self, db_config : dict): + self.db_config = db_config + self.connection = None + self.cursor = None + + def __enter__(self): + try: + self.connection = pymysql.connect( + host=self.db_config['host'], + port=self.db_config['port'], + user=self.db_config['user'], + password=self.db_config['password'], + db=self.db_config['db'] + ) + self.cursor = self.connection.cursor() + return self.cursor + except (OperationalError, KeyError) as err: + print(err.args) + return None + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.connection and self.cursor: + if exc_type: + print(exc_type, '\n', exc_val) + self.connection.rollback() + else: + self.connection.commit() + self.cursor.close() + self.connection.close() + return True + \ No newline at end of file diff --git a/App/Requests/db/__init__.py b/App/Requests/db/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/App/Requests/db/select.py b/App/Requests/db/select.py new file mode 100644 index 0000000..22cc3e7 --- /dev/null +++ b/App/Requests/db/select.py @@ -0,0 +1,12 @@ +from .DBconnect import DBContextManager + +def select_list(db_config, sql) -> list: + with DBContextManager(db_config) as cursor: + if cursor is None: + raise ValueError("Cursor not created") + else: + cursor.execute(sql) + result = cursor.fetchall() + schema = [item[0] for item in cursor.description] + lst = [dict(zip(schema, row)) for row in result] + return lst \ No newline at end of file diff --git a/App/Requests/db/sql_provider.py b/App/Requests/db/sql_provider.py new file mode 100644 index 0000000..a3a1855 --- /dev/null +++ b/App/Requests/db/sql_provider.py @@ -0,0 +1,14 @@ +import os +from string import Template + +class SQLProvider: + def __init__(self, file_path): + self.scripts = {} + for file in os.listdir(file_path): + _sql = open(f'{file_path}/{file}').read() + self.scripts[file] = Template(_sql) + + def get(self, name, params) -> dict: + if name not in self.scripts: + raise ValueError(f'SQL template {name} not found') + return self.scripts[name].substitute(**params) \ No newline at end of file diff --git a/App/Requests/requests_model.py b/App/Requests/requests_model.py index 69fc110..813be3d 100644 --- a/App/Requests/requests_model.py +++ b/App/Requests/requests_model.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from Database.select import select_list -from Database.sql_provider import SQLProvider +from db.select import select_list +from db.sql_provider import SQLProvider from flask import current_app from os import path