savagedb_bot/db.py
Vlad dcec5ef020 Добавлены основные файлы для бота Salvagedb:
- Создан файл .gitignore для исключения временных и сгенерированных файлов.
- Добавлен файл .python-version для указания версии Python.
- Реализован класс OracleDatabase для работы с базой данных Oracle.
- Создан основной файл main.py с логикой бота на aiogram.
- Добавлен middleware для работы с сессией базы данных.
- Создан файл pyproject.toml для управления зависимостями.
- Добавлен README.md с инструкциями по запуску.
- Создан скрипт run.cmd для запуска бота с необходимыми переменными окружения.
- Добавлен файл uv.lock для управления зависимостями через uv.
2025-05-25 01:13:33 +03:00

60 lines
2.7 KiB
Python

# db.py
import oracledb
from typing import Optional, Tuple
class OracleDatabase:
def __init__(self, user: str, password: str, dsn: str):
self._user = user
self._password = password
self._dsn = dsn
self._pool: Optional[oracledb.ConnectionPool] = None
async def connect(self):
# Oracle does not support true async I/O; use threaded connection pool
self._pool = oracledb.create_pool(
user=self._user,
password=self._password,
dsn=self._dsn,
min=1,
max=4,
increment=1,
getmode=oracledb.POOL_GETMODE_WAIT
)
async def close(self):
if self._pool:
self._pool.close()
async def fetch_user(self, user_id: int):
# Manual async wrapper since oracledb is synchronous (threaded)
def _query():
with self._pool.acquire() as conn:
with conn.cursor() as cur:
cur.execute("SELECT id, name FROM users WHERE id = :id", {"id": user_id})
return cur.fetchone()
import asyncio
return await asyncio.to_thread(_query)
async def fetch_vin_info(self, vin: str) -> Tuple[str, str, str]:
# Manual async wrapper since oracledb is synchronous (threaded)
def _query():
with self._pool.acquire() as conn:
with conn.cursor() as cur:
query = """
select 'None',
COALESCE((select value from m_JSONS_FROM_NHTSA v3 where v3.svin =s.svin and v3.variableid ='26'),
(select val from vind2 where svin = substr(s.vin, 1, 8) || '*' || substr(s.vin, 10, 2) and varb = 'Make'),'UNKNOWN') make,
COALESCE((select value from m_JSONS_FROM_NHTSA v3 where v3.svin =s.svin and v3.variableid ='28'),
(select val from vind2 where svin = substr(s.vin, 1, 8) || '*' || substr(s.vin, 10, 2) and varb = 'Model'),'UNKNOWN') model,
COALESCE((select value from m_JSONS_FROM_NHTSA v3 where v3.svin =s.svin and v3.variableid ='29'),
(select val from vind2 where svin = substr(s.vin, 1, 8) || '*' || substr(s.vin, 10, 2) and varb = 'Model Year'),'UNKNOWN') year
from (select substr(:vin,1,10) svin, :vin vin from dual) s
"""
cur.execute(query, {"vin": vin})
result = cur.fetchone()
if result:
return result[1], result[2], result[3] # make, model, year
return "UNKNOWN", "UNKNOWN", "UNKNOWN"
import asyncio
return await asyncio.to_thread(_query)