from typing import AsyncGenerator from sqlalchemy import Column, Integer, String from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from sqlalchemy.orm import DeclarativeBase from fastapi import Depends from fastapi_users.db import SQLAlchemyBaseUserTableUUID, SQLAlchemyUserDatabase SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db" engine = create_async_engine( SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} ) SessionLocal = async_sessionmaker(bind=engine, expire_on_commit=False) Base = declarative_base() class UserDatabase(Base):#класс пользователя __tablename__ = "users" id = Column(Integer, primary_key=True, index=True)#айди пользователя phone = Column(Integer, nullable=True)#номер телефона пользователя email = Column(String)#электронная почта пользователя password = Column(String) # пароль hashed_password = Column(String) name = Column(String, nullable=True)#имя пользователя surname = Column(String)#фамилия пользователя class Announcement(Base): #класс объявления __tablename__ = "announcements" id = Column(Integer, primary_key=True, index=True)#айди объявления user_id = Column(Integer)#айди создателя объявления name = Column(String) # название объявления category = Column(String)#категория продукта из объявления best_by = Column(Integer)#срок годности продукта из объявления address = Column(String) longtitude = Column(Integer) latitude = Column(Integer) description = Column(String)#описание продукта в объявлении src = Column(String, nullable=True) #изображение продукта в объявлении metro = Column(String)#ближайщее метро от адреса нахождения продукта trashId = Column(Integer, nullable=True) booked_by = Column(Integer)#статус бронирования (либо -1, либо айди бронирующего) class Trashbox(Base):#класс мусорных баков __tablename__ = "trashboxes" id = Column(Integer, primary_key=True, index=True)#айди name = Column(String, nullable=True)#имя пользователя address = Column(String) latitude = Column(Integer) longtitude = Column(Integer) category = Column(String)#категория продукта из объявления # This function can be called during the initialization of the FastAPI app. async def create_db_and_tables(): async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) async def get_async_session() -> AsyncGenerator[AsyncSession, None]: async with async_session_maker() as session: yield session async def get_user_db(session: AsyncSession = Depends(get_async_session)): yield SQLAlchemyUserDatabase(session, User)