91 lines
No EOL
3.5 KiB
Python
91 lines
No EOL
3.5 KiB
Python
from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, UniqueConstraint, Boolean
|
||
from sqlalchemy.orm import relationship
|
||
from sqlalchemy.sql import func
|
||
from sqlalchemy.ext.declarative import declarative_base
|
||
|
||
Base = declarative_base()
|
||
|
||
class Auth(Base):
|
||
__tablename__ = 'auth'
|
||
user_id = Column(Integer, primary_key=True)
|
||
login = Column(String, unique=True, nullable=False)
|
||
password = Column(String, nullable=False)
|
||
|
||
user = relationship("Users", back_populates="auth", cascade="all, delete-orphan", uselist=False)
|
||
|
||
|
||
|
||
class Users(Base):
|
||
__tablename__ = 'users'
|
||
user_id = Column(Integer, ForeignKey('auth.user_id'), primary_key=True)
|
||
dog_id = Column(Integer, ForeignKey('dogs.dog_id'))
|
||
username = Column(String, nullable=False)
|
||
level = Column(Integer, default=1)
|
||
achievement = Column(Text)
|
||
|
||
# Связи
|
||
auth = relationship("Auth", back_populates="user") # Обратная связь с Auth
|
||
dog = relationship("Dogs", back_populates="users") # Связь с таблицей Dogs
|
||
game_sessions = relationship("GameSession", back_populates="user") # Связь с таблицей GameSession
|
||
notifications = relationship("Notifications", back_populates="user") # Связь с уведомлениями
|
||
|
||
|
||
class Dogs(Base):
|
||
__tablename__ = 'dogs'
|
||
dog_id = Column(Integer, primary_key=True)
|
||
breed = Column(String)
|
||
characteristics = Column(Text)
|
||
behavior = Column(Text)
|
||
care_info = Column(Text)
|
||
admin_comments = Column(Text)
|
||
|
||
# Связь с таблицей Users
|
||
users = relationship("Users", back_populates="dog")
|
||
# Связь с таблицей Questions
|
||
questions = relationship("Questions", back_populates="dog")
|
||
|
||
|
||
class Questions(Base):
|
||
__tablename__ = 'questions'
|
||
question_id = Column(Integer, primary_key=True)
|
||
dog_id = Column(Integer, ForeignKey('dogs.dog_id'))
|
||
question_text = Column(Text, nullable=False)
|
||
image_url = Column(String)
|
||
helpful_info = Column(Text)
|
||
incorrect_attempts = Column(Integer, default=0)
|
||
|
||
# Связь с таблицей Dogs
|
||
dog = relationship("Dogs", back_populates="questions")
|
||
|
||
|
||
class GameSession(Base):
|
||
__tablename__ = 'game_sessions'
|
||
__table_args__ = (
|
||
UniqueConstraint('user_id', 'level', name='uix_user_level'),
|
||
)
|
||
session_id = Column(Integer, primary_key=True)
|
||
user_id = Column(Integer, ForeignKey('users.user_id'))
|
||
level = Column(Integer, nullable=False)
|
||
score = Column(Integer, default=0)
|
||
duration = Column(Integer) # Время игры в секундах
|
||
steps = Column(Integer, default=0) # Количество шагов
|
||
start_time = Column(DateTime, default=func.now())
|
||
end_time = Column(DateTime, nullable=True)
|
||
health = Column(Integer, default=100) # Здоровье
|
||
hunger = Column(Integer, default=0) # Голод
|
||
sleepiness = Column(Integer, default=0) # Сонливость
|
||
|
||
# Связь с таблицей Users
|
||
user = relationship("Users", back_populates="game_sessions")
|
||
|
||
|
||
class Notifications(Base):
|
||
__tablename__ = 'notifications'
|
||
notification_id = Column(Integer, primary_key=True)
|
||
user_id = Column(Integer, ForeignKey('users.user_id'))
|
||
message = Column(Text, nullable=False)
|
||
timestamp = Column(DateTime, default=func.now())
|
||
is_read = Column(Boolean, default=False) # Булевый тип для read
|
||
|
||
# Связь с таблицей Users
|
||
user = relationship("Users", back_populates="notifications") |