Проведен парсинг, тест Nona
parent
93fba31cc0
commit
2aec537031
41
app/main.py
41
app/main.py
|
|
@ -1,6 +1,43 @@
|
||||||
import working_database
|
import working_database
|
||||||
import parse_saby
|
import parse_saby
|
||||||
|
from dateutil import parser
|
||||||
|
|
||||||
|
def parse_data_for_bd(dict_data: dict) -> list[list]:
|
||||||
|
"""
|
||||||
|
Фуннкция приминмает словарь и парсит его в лист листов
|
||||||
|
для передачи в БД. Каждый лист должен состоять из 6 элементов
|
||||||
|
"""
|
||||||
|
result_list = []
|
||||||
|
for key_id, value_data in dict_data.items():
|
||||||
|
if len(value_data) != 5:
|
||||||
|
continue
|
||||||
|
organ, names, date_from_str, date_to_str, ver = value_data
|
||||||
|
# Парсим даты
|
||||||
|
if date_from_str:
|
||||||
|
date_from = parser.parse(date_from_str).date()
|
||||||
|
date_from = str(date_from.strftime('%d.%m.%Y'))
|
||||||
|
#TODO date_from cannot be NULL\NONE
|
||||||
|
else:
|
||||||
|
print(f"Отсутсвует дата: {key_id}: {organ} {names}")
|
||||||
|
continue
|
||||||
|
if date_to_str:
|
||||||
|
date_to = parser.parse(date_to_str).date()
|
||||||
|
date_to = str(date_to.strftime('%d.%m.%Y'))
|
||||||
|
#TODO change to NULL
|
||||||
|
else: date_to = None
|
||||||
|
parametrs_list = [int(key_id), organ, names, date_to, date_from, ver]
|
||||||
|
result_list.append(parametrs_list)
|
||||||
|
|
||||||
|
print("Отправляемых агрументов: ", *parametrs_list)
|
||||||
|
print("Типо данных: ", list(map(type, parametrs_list)))
|
||||||
|
return result_list
|
||||||
|
|
||||||
result_dict_data = parse_saby.process_reports_parse()
|
result_dict_data = parse_saby.process_reports_parse()
|
||||||
test = working_database.SimpleDB()
|
list_data = parse_data_for_bd(result_dict_data)
|
||||||
test.data_transfer_in_database(result_dict_data)
|
PushDB = working_database.SimpleDB()
|
||||||
|
PushDB.data_transfer_in_database(list_data)
|
||||||
|
|
||||||
|
if __name__ in "__main__":
|
||||||
|
result_dict_data = parse_saby.process_reports_parse()
|
||||||
|
list_data = parse_data_for_bd(result_dict_data)
|
||||||
|
print(list_data)
|
||||||
|
|
@ -1,46 +1,73 @@
|
||||||
from os import getenv, environ
|
from os import environ
|
||||||
import hvac
|
import hvac
|
||||||
from oracledb import Error, create_pool, init_oracle_client, DatabaseError
|
import hvac.exceptions
|
||||||
from fastapi import HTTPException
|
from oracledb import Error, create_pool, init_oracle_client
|
||||||
from dateutil import parser
|
|
||||||
import datetime
|
|
||||||
init_oracle_client()
|
init_oracle_client()
|
||||||
|
|
||||||
class SimpleDB:
|
class SimpleDB:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._connect_hvac()
|
self._create_db_pool_from_vault()
|
||||||
self.pool
|
self.pool
|
||||||
init_oracle_client()
|
init_oracle_client()
|
||||||
#TODO: rename
|
|
||||||
def _connect_hvac(self):
|
def _handle_vault_exception(self, e: Exception, message: str):
|
||||||
"""
|
"""
|
||||||
Подключение к Vault и получение параметров БД
|
Обработка исключений Vault с возвратом понятного сообщения.
|
||||||
|
"""
|
||||||
|
print(message)
|
||||||
|
if isinstance(e, hvac.exceptions.InvalidPath):
|
||||||
|
raise hvac.exceptions.InvalidPath("Database configuration not found in Vault")
|
||||||
|
elif isinstance(e, hvac.exceptions.Forbidden):
|
||||||
|
raise hvac.exceptions.Forbidden("Permission denied to access Vault secrets")
|
||||||
|
elif isinstance(e, hvac.exceptions.Unauthorized):
|
||||||
|
raise hvac.exceptions.Unauthorized("Invalid Vault token")
|
||||||
|
elif isinstance(e, hvac.exceptions.VaultError):
|
||||||
|
raise hvac.exceptions.VaultError(f"Vault secret retrieval failed: {e}")
|
||||||
|
elif isinstance(e, hvac.exceptions.InvalidRequest):
|
||||||
|
raise hvac.exceptions.InvalidRequest(f"Missing database parameter in Vault response: {e}")
|
||||||
|
elif isinstance(e, hvac.exceptions.VaultDown):
|
||||||
|
raise hvac.exceptions.VaultDown(f"Database server not available: {e}")
|
||||||
|
else:
|
||||||
|
raise Exception (f'Unexpected error reading from Vault: {e}')
|
||||||
|
|
||||||
|
#TODO: rename +
|
||||||
|
def _create_db_pool_from_vault(self):
|
||||||
|
"""
|
||||||
|
Подключение к Vault и получение параметров для подключеник к БД
|
||||||
"""
|
"""
|
||||||
#TODO разнести в разные try_exception
|
#TODO разнести в разные try_exception
|
||||||
try:
|
try:
|
||||||
|
# Подключение к Vault
|
||||||
client = hvac.Client(
|
client = hvac.Client(
|
||||||
url='https://vlt.dataekb.ru:8222',
|
url='https://vlt.dataekb.ru:8222',
|
||||||
token=environ.get('VAULT_TOKEN'),
|
token=environ.get('VAULT_TOKEN'),
|
||||||
)
|
)
|
||||||
|
except Exception as e:
|
||||||
read_response = client.secrets.kv.v2.read_secret_version(
|
self._handle_vault_exception(e, "Ошибка при создание покдлючения c Vault")
|
||||||
|
try:
|
||||||
|
# Чтение секретов из Vault
|
||||||
|
secret_read_response = client.secrets.kv.v2.read_secret_version(
|
||||||
path='oracledb',
|
path='oracledb',
|
||||||
mount_point='kv'
|
mount_point='kv'
|
||||||
)
|
)
|
||||||
|
except Exception as e:
|
||||||
|
self._handle_vault_exception(e, "Ошибка чтение скретов из Vault")
|
||||||
|
|
||||||
|
try:
|
||||||
# Создаем пул соединений
|
# Создаем пул соединений
|
||||||
self.pool = create_pool(
|
self.pool = create_pool(
|
||||||
user=read_response['data']['data']['user'],
|
user=secret_read_response['data']['data']['user'],
|
||||||
password=read_response['data']['data']['password'],
|
password=secret_read_response['data']['data']['password'],
|
||||||
dsn=read_response['data']['data']['cs'],
|
dsn=secret_read_response['data']['data']['cs'],
|
||||||
min=2,
|
min=2,
|
||||||
max=10,
|
max=10,
|
||||||
increment=1
|
increment=1
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(status_code=500, detail=f"Database connection failed: {e}")
|
self._handle_vault_exception(e, "Ошибка при создание пула для подключение к Oracle")
|
||||||
|
|
||||||
def data_transfer_in_database(self, dict_data: dict):
|
def data_transfer_in_database(self, list_data: list):
|
||||||
"""
|
"""
|
||||||
Передача данных в базу
|
Передача данных в базу
|
||||||
Процедура на вставку:
|
Процедура на вставку:
|
||||||
|
|
@ -55,32 +82,15 @@ class SimpleDB:
|
||||||
VERS IN VARCHAR2)
|
VERS IN VARCHAR2)
|
||||||
"""
|
"""
|
||||||
if not self.pool:
|
if not self.pool:
|
||||||
raise HTTPException(status_code=500, detail="Database pool not initialized")
|
raise ValueError(self.pool, "Database pool not initialized")
|
||||||
|
if not list_data:
|
||||||
if not dict_data:
|
raise ValueError(list_data, "No data to process")
|
||||||
raise ValueError(dict_data, "No data to process")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with self.pool.acquire() as connection:
|
with self.pool.acquire() as connection:
|
||||||
with connection.cursor() as cursor:
|
with connection.cursor() as cursor:
|
||||||
# Передача данных в БД
|
for list_argument_bd in list_data:
|
||||||
for id, value in dict_data.items():
|
id, organ, names, date_from, date_to, ver = list_argument_bd
|
||||||
if len(value) != 5:
|
|
||||||
continue
|
|
||||||
organ, names, date_from_str, date_to_str, ver = value
|
|
||||||
# Парсим даты
|
|
||||||
if date_from_str:
|
|
||||||
date_from = parser.parse(date_from_str).date()
|
|
||||||
#date_from = str(date_from.strftime('%d.%m.%Y'))
|
|
||||||
#TODO date_from cannot be NULL\NONE
|
|
||||||
else: date_from = parser.parse('01.01.2000')
|
|
||||||
if date_to_str:
|
|
||||||
date_to = parser.parse(date_to_str).date()
|
|
||||||
#date_to = str(date_to.strftime('%d.%m.%Y'))
|
|
||||||
#TODO change to NULL
|
|
||||||
else: date_to = parser.parse('01.01.2000')
|
|
||||||
print("Вывод отправляемых агрументов: ", id, organ, names, date_from, date_to, ver)
|
|
||||||
print(type(int(id)), type(organ), type(names), type(date_from), type(date_to), type(ver))
|
|
||||||
|
|
||||||
cursor.callproc('P_RK_GOVERNMENT_REPORTS_INSERS', [
|
cursor.callproc('P_RK_GOVERNMENT_REPORTS_INSERS', [
|
||||||
int(id),
|
int(id),
|
||||||
|
|
@ -92,5 +102,6 @@ class SimpleDB:
|
||||||
])
|
])
|
||||||
|
|
||||||
except Error as e:
|
except Error as e:
|
||||||
raise HTTPException(status_code=500, detail=f"Database error: {e}")
|
raise Error(f'Ошибка при отправке данных в БД: {e}')
|
||||||
|
except Exception as e:
|
||||||
|
raise Error(f'Неожиданная ошибка: {e}')
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue