from datetime import datetime from sqlalchemy import (Column, DateTime, Float, Integer, String, Text, create_engine) from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker Base = declarative_base() class Photo(Base): __tablename__ = "photos" id = Column(Integer, primary_key=True, autoincrement=True) input_filename = Column(String, nullable=False) thumbnail_filename = Column(String, nullable=False) focal_length = Column(String) aperture = Column(String) shutter_speed = Column(String) date_taken = Column(DateTime) iso = Column(Integer) width = Column(Integer) height = Column(Integer) highlight_color = Column(String) orientation = Column(Integer) unique_key = Column(String(16), nullable=False) class SiteConfig(Base): __tablename__ = "site_config" id = Column(Integer, primary_key=True, autoincrement=True) # Appearance site_title = Column(String, nullable=False, default="Spectra") accent_color = Column(String, nullable=False, default="#007bff") # About author_name = Column(String, nullable=False, default="Your Name") author_location = Column(String, nullable=False, default="Your Location") profile_image = Column(String, nullable=False, default="/static/profile.jpg") bio = Column( Text, nullable=False, default="Write your bio in *markdown* here.\n\nSupports **multiple** paragraphs.", ) # Metadata updated_at = Column(DateTime, default=datetime.utcnow) engine = create_engine("sqlite:///photos.db") def init_db(): session = None try: Base.metadata.create_all(engine) # Create default site config if none exists session = Session() if not session.query(SiteConfig).first(): session.add(SiteConfig()) session.commit() except Exception as e: # Tables already exist, skip creation pass finally: if session: session.close() init_db() Session = sessionmaker(bind=engine)