feat: add SQLAlchemy models for Category, CategoryWord, Game, Word
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
2930adb51d
commit
041b768cd4
@@ -0,0 +1,5 @@
|
||||
from sqlalchemy.orm import DeclarativeBase
|
||||
|
||||
|
||||
class Base(DeclarativeBase):
|
||||
pass
|
||||
@@ -0,0 +1,24 @@
|
||||
from sqlalchemy import Column, ForeignKey, Integer, String, UniqueConstraint
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from models import Base
|
||||
|
||||
|
||||
class Category(Base):
|
||||
__tablename__ = "categories"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
name = Column(String(50), unique=True, nullable=False)
|
||||
|
||||
words = relationship("CategoryWord", back_populates="category")
|
||||
|
||||
|
||||
class CategoryWord(Base):
|
||||
__tablename__ = "category_words"
|
||||
__table_args__ = (UniqueConstraint("category_id", "word"),)
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
category_id = Column(Integer, ForeignKey("categories.id"), nullable=False)
|
||||
word = Column(String(20), nullable=False)
|
||||
|
||||
category = relationship("Category", back_populates="words")
|
||||
@@ -0,0 +1,47 @@
|
||||
import uuid
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from sqlalchemy import (
|
||||
Boolean,
|
||||
Column,
|
||||
DateTime,
|
||||
ForeignKey,
|
||||
Integer,
|
||||
String,
|
||||
)
|
||||
from sqlalchemy.orm import relationship
|
||||
from sqlalchemy.types import JSON
|
||||
|
||||
from models import Base
|
||||
|
||||
|
||||
class Game(Base):
|
||||
__tablename__ = "games"
|
||||
|
||||
id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
|
||||
category_id = Column(Integer, ForeignKey("categories.id"), nullable=False)
|
||||
board_size = Column(Integer, nullable=False, default=10)
|
||||
grid = Column(JSON, nullable=False)
|
||||
status = Column(String(20), nullable=False, default="in_progress")
|
||||
started_at = Column(
|
||||
DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)
|
||||
)
|
||||
completed_at = Column(DateTime, nullable=True)
|
||||
|
||||
category = relationship("Category")
|
||||
words = relationship("Word", back_populates="game")
|
||||
|
||||
|
||||
class Word(Base):
|
||||
__tablename__ = "words"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
game_id = Column(String(36), ForeignKey("games.id"), nullable=False)
|
||||
text = Column(String(20), nullable=False)
|
||||
start_row = Column(Integer, nullable=False)
|
||||
start_col = Column(Integer, nullable=False)
|
||||
direction = Column(String(2), nullable=False)
|
||||
found = Column(Boolean, nullable=False, default=False)
|
||||
found_at = Column(DateTime, nullable=True)
|
||||
|
||||
game = relationship("Game", back_populates="words")
|
||||
Reference in New Issue
Block a user