from dotenv import load_dotenv load_dotenv() import os from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import declarative_base from sqlalchemy.ext.asyncio import async_sessionmaker DATABASE_URL = os.getenv("DATABASE_URL", "sqlite+aiosqlite:///bot.db") if DATABASE_URL.startswith("sqlite+aiosqlite:///"): db_path = DATABASE_URL.replace("sqlite+aiosqlite:///", "") # Убираем лишний слэш в конце, если есть if db_path.endswith(os.sep): db_path = db_path.rstrip(os.sep) abs_db_path = os.path.abspath(db_path) db_dir = os.path.dirname(abs_db_path) if db_dir and not os.path.exists(db_dir): os.makedirs(db_dir, exist_ok=True) # Если по этому пути уже есть папка, удаляем её и создаём файл if os.path.isdir(abs_db_path): import shutil shutil.rmtree(abs_db_path) # Если файла нет, создаём пустой файл if not os.path.exists(abs_db_path): open(abs_db_path, 'a').close() engine = create_async_engine(DATABASE_URL, future=True, echo=False) AsyncSessionLocal = async_sessionmaker(engine, expire_on_commit=False) Base = declarative_base() async def init_db(): print(f'База данных: {DATABASE_URL}') need_create = False if DATABASE_URL.startswith("sqlite+aiosqlite:///"): db_path = DATABASE_URL.replace("sqlite+aiosqlite:///", "") abs_db_path = os.path.abspath(db_path) print(f"Абсолютный путь к базе данных: {abs_db_path}") if not os.path.exists(abs_db_path): print("Файл базы данных отсутствует, будет создан.") need_create = True else: print(f"База данных: {DATABASE_URL}") # Для других СУБД всегда пытаемся создать таблицы need_create = True if need_create: async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) tables = Base.metadata.tables.keys() print(f"Созданы таблицы: {', '.join(tables)}") else: print("База данных уже существует, создание таблиц пропущено.")