food-analyzer-API / db /models.py
Prathamesh Sable
Shift to MySQL
3f55893
from sqlalchemy import Column, Integer, String, Boolean, Text, JSON, ForeignKey, DateTime, text,TIMESTAMP
from sqlalchemy.orm import relationship, Mapped, mapped_column
from sqlalchemy.sql import func
from .database import Base
from typing import List, Optional
from datetime import datetime
class Ingredient(Base):
__tablename__ = "ingredients"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(255), unique=True, index=True)
alternate_names = Column(Text, nullable=True)
safety_rating = Column(Integer, nullable=True)
description = Column(Text, nullable=True)
health_effects = Column(Text, nullable=True)
allergic_info = Column(Text, nullable=True)
diet_type = Column(String(255), nullable=True)
# Fix the default timestamp for MySQL
created_at = Column(TIMESTAMP, server_default=text('CURRENT_TIMESTAMP'))
updated_at = Column(DateTime(timezone=True),nullable=True)
# Relationships
sources = relationship("IngredientSource", back_populates="ingredient")
class IngredientSource(Base):
__tablename__ = "ingredient_sources"
id = Column(Integer, primary_key=True, index=True)
ingredient_id = Column(Integer, ForeignKey("ingredients.id"))
source_name = Column(String(255), nullable=False)
found = Column(Boolean, default=False)
summary = Column(Text, nullable=True)
data = Column(Text, nullable=True)
# Relationships
ingredient = relationship("Ingredient", back_populates="sources")
class Marker(Base):
__tablename__ = "markers"
id = Column(Integer, primary_key=True, index=True)
image_name = Column(String(255), nullable=False)
vuforia_id = Column(String(255), nullable=False)
product_id = Column(Integer, ForeignKey("products.id"))
# Traditional relationship syntax
product = relationship("Product", back_populates="markers")
class Product(Base):
__tablename__ = "products"
id = Column(Integer, primary_key=True, index=True)
product_name = Column(String(255), nullable=False)
ingredients = Column(Text, nullable=True)
ingredients_analysis = Column(Text, nullable=True)
overall_safety_score = Column(Integer, nullable=True)
suitable_diet_types = Column(String(255), nullable=True)
allergy_warnings = Column(Text, nullable=True)
usage_recommendations = Column(Text, nullable=True)
health_insights = Column(Text, nullable=True)
ingredient_interactions = Column(Text, nullable=True)
key_takeaway = Column(Text, nullable=True)
ingredients_count = Column(Integer, nullable=True)
user_id = Column(Integer, nullable=True)
timestamp = Column(DateTime, nullable=True)
ingredient_ids= Column(Text, nullable=True)
data_quality_warnings = Column(Text, nullable=True)
markers: Mapped[List["Marker"]] = relationship(back_populates="product")
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(255), unique=False, index=False, nullable=False)
email = Column(String(255), unique=True, index=True, nullable=False)
hashed_password = Column(String(255), nullable=False)
is_active = Column(Boolean, default=True)
# Relationships
preferences = relationship(
"UserPreferences",
back_populates="user",
cascade="all, delete-orphan"
)
scan_history = relationship(
"ScanHistory",
back_populates="user",
cascade="all, delete-orphan"
)
class UserPreferences(Base):
__tablename__ = "user_preferences"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"))
dietary_restrictions = Column(String(255), nullable=True)
allergens = Column(Text, nullable=True)
preferred_ingredients = Column(Text, nullable=True)
disliked_ingredients = Column(Text, nullable=True)
# Relationships
user = relationship("User", back_populates="preferences")
class ScanHistory(Base):
__tablename__ = "scan_history"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"))
product_id = Column(Integer)
scan_date = Column(DateTime, default=datetime.now)
# Relationships
user = relationship("User", back_populates="scan_history")