parse_saby/app/working_database.py

121 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from os import getenv, environ
import hvac
from oracledb import Error, create_pool, init_oracle_client, DatabaseError
from fastapi import HTTPException
from dateutil import parser
init_oracle_client()
class SimpleDB:
def __init__(self):
self._connect_hvac()
self.pool
init_oracle_client()
def _connect_hvac(self):
"""
Подключение к Vault и получение параметров БД
"""
try:
client = hvac.Client(
url='https://vlt.dataekb.ru:8222',
token=environ.get('VAULT_TOKEN'),
)
read_response = client.secrets.kv.v2.read_secret_version(
path='oracledb',
mount_point='kv'
)
# Создаем пул соединений
self.pool = create_pool(
user=read_response['data']['data']['user'],
password=read_response['data']['data']['password'],
dsn=read_response['data']['data']['cs'],
min=2,
max=10,
increment=1
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Database connection failed: {e}")
def data_transfer_in_database(self, dict_data: dict):
"""
Передача данных в базу
Процедура на вставку:
P_RK_GOVERNMENT_REPORTS_INSERS
(
ID IN NUMBER,
ORGAN IN VARCHAR2,
NAMES IN VARCHAR2,
DATE_FROM in date,
DATE_TO in date,
VERS IN VARCHAR2)
"""
if not self.pool:
raise HTTPException(status_code=500, detail="Database pool not initialized")
if not dict_data:
raise ValueError(dict_data, "No data to process")
try:
with self.pool.acquire() as connection:
with connection.cursor() as cursor:
# Полная информация о процедуре
query = """
SELECT
a.argument_name,
a.data_type,
a.data_length,
a.data_precision,
a.data_scale,
a.in_out,
a.position,
a.default_value
FROM user_arguments a
WHERE a.object_name = UPPER(:proc_name)
ORDER BY a.overload, a.position
"""
procedure_name = 'P_RK_SEND_JSON_LIST_FACEACC'
cursor.execute(query, proc_name=procedure_name)
results = cursor.fetchall()
print(f"Метаданные процедуры {procedure_name}:")
for row in results:
print(f" Параметр: {row[0]}")
print(f" Тип данных: {row[1]}")
print(f" Направление: {row[5]}")
print(f" Позиция: {row[6]}")
if row[7]:
print(f" Значение по умолчанию: {row[7]}")
print(" " + "-"*30)
# Передача данных в БД
for id, value in dict_data.items():
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'))
else: date_from = '01.01.2000'
if date_to_str:
date_to = parser.parse(date_to_str).date()
#date_to = str(date_to.strftime('%d.%m.%Y'))
else: date_to = '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_SEND_JSON_LIST_FACEACC', [
int(id),
organ,
names,
date_from,
date_to,
ver,
])
except Error as e:
raise HTTPException(status_code=500, detail=f"Database error: {e}")