api-python-tested/Controllers/Postgres/schema.py

65 lines
2.0 KiB
Python

from Controllers.Postgres.engine import Base
from sqlalchemy import Column, Integer, String, Float, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy_mixins.serialize import SerializeMixin
from sqlalchemy_mixins.repr import ReprMixin
from sqlalchemy_mixins.smartquery import SmartQueryMixin
from sqlalchemy_mixins.activerecord import ActiveRecordMixin
class BasicMixin(
Base,
ActiveRecordMixin,
SerializeMixin,
ReprMixin,
SmartQueryMixin,
):
__abstract__ = True
__repr__ = ReprMixin.__repr__
id = mapped_column(Integer, primary_key=True)
class Product(BasicMixin):
__tablename__ = 'products'
name = Column(String, unique=True)
price = Column(Float)
class Category(BasicMixin):
__tablename__ = 'categories'
name = Column(String, unique=True)
class Supplier(BasicMixin):
__tablename__ = 'suppliers'
name = Column(String, unique=True)
rating = Column(Float)
class ShippingAddress(BasicMixin):
__tablename__ = 'shipping_addresses'
address_line_1 = Column(String, unique=True)
city = Column(String)
zip_code = Column(String)
class Order(BasicMixin):
__tablename__ = 'orders'
order_date = Column(String)
total_amount = Column(Float)
user_id = Column(Integer, ForeignKey('users.id'))
shipping_address_id = Column(Integer, ForeignKey('shipping_addresses.id'))
user = relationship("User", back_populates="orders")
shipping_address = relationship("ShippingAddress")
class User(BasicMixin):
__tablename__ = 'users'
username = Column(String, unique=True)
account_balance = Column(Float)
preferred_category_id = Column(Integer, ForeignKey('categories.id'))
last_ordered_product_id = Column(Integer, ForeignKey('products.id'))
supplier_rating_id = Column(Integer, ForeignKey('suppliers.id'))
preferred_category = relationship("Category")
last_ordered_product = relationship("Product")
supplier_rating = relationship("Supplier")
orders = relationship("Order", back_populates="user")