75 lines
3.1 KiB
Python
75 lines
3.1 KiB
Python
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) |