121 lines
4.8 KiB
Python
121 lines
4.8 KiB
Python
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 = 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'))
|
||
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_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}")
|
||
|