from sqlalchemy import BigInteger, ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column, relationship, DeclarativeBase from sqlalchemy.ext.asyncio import AsyncAttrs, async_sessionmaker, create_async_engine from typing import List from config import ENGINE, ECHO engine = create_async_engine(url=ENGINE)#, echo=ECHO) async_session = async_sessionmaker(engine) class Base(AsyncAttrs, DeclarativeBase): pass class User(Base): __tablename__ = 'users' id: Mapped[int] = mapped_column(primary_key=True) tg_id = mapped_column(BigInteger) basket_rel: Mapped[List['Basket']] = relationship(back_populates='user_rel') class Category(Base): __tablename__ = 'categories' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(50)) item_rel: Mapped[List['Item']] = relationship(back_populates='category_rel') class Item(Base): __tablename__ = 'items' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(50)) description: Mapped[str] = mapped_column(String(200)) photo: Mapped[str] = mapped_column(String(200)) price: Mapped[int] = mapped_column() category: Mapped[int] = mapped_column(ForeignKey('categories.id')) category_rel: Mapped['Category'] = relationship(back_populates='item_rel') basket_rel: Mapped[List['Basket']] = relationship(back_populates='item_rel') class Basket(Base): __tablename__ = 'basket' id: Mapped[int] = mapped_column(primary_key=True) user: Mapped[int] = mapped_column(ForeignKey('users.id')) item: Mapped[int] = mapped_column(ForeignKey('items.id')) user_rel: Mapped['User'] = relationship(back_populates='basket_rel') item_rel: Mapped['Item'] = relationship(back_populates='basket_rel') async def async_main(): async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all)