60 lines
2.4 KiB
Python
60 lines
2.4 KiB
Python
from sqlalchemy import create_engine, Column, Integer, String, Text, Date, DateTime, ForeignKey
|
|
from sqlalchemy.orm import declarative_base, sessionmaker, relationship, scoped_session
|
|
from datetime import datetime
|
|
import os
|
|
|
|
DB_PATH = os.path.join(os.path.dirname(__file__), 'app.db')
|
|
engine = create_engine(f'sqlite:///{DB_PATH}', echo=False, future=True, pool_pre_ping=True, pool_recycle=3600)
|
|
SessionLocal = scoped_session(sessionmaker(bind=engine, autoflush=False, autocommit=False))
|
|
Base = declarative_base()
|
|
|
|
class Profile(Base):
|
|
__tablename__ = 'profiles'
|
|
id = Column(String(200), primary_key=True) # Support both int and UUID strings
|
|
name = Column(String(100), unique=True, nullable=False)
|
|
email = Column(String(100), default='')
|
|
contact_number = Column(String(50), default='')
|
|
default_key = Column(String(10), default='C')
|
|
notes = Column(Text, default='')
|
|
|
|
class Song(Base):
|
|
__tablename__ = 'songs'
|
|
id = Column(String(200), primary_key=True) # Support UUID strings
|
|
title = Column(String(200), nullable=False)
|
|
artist = Column(String(200), default='')
|
|
band = Column(String(200), default='')
|
|
singer = Column(String(200), default='')
|
|
lyrics = Column(Text, default='')
|
|
chords = Column(Text, default='')
|
|
created_at = Column(DateTime, default=datetime.now)
|
|
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
|
|
|
|
class Plan(Base):
|
|
__tablename__ = 'plans'
|
|
id = Column(Integer, primary_key=True)
|
|
date = Column(Date, nullable=False)
|
|
profile_id = Column(String(200), ForeignKey('profiles.id'))
|
|
memo = Column(Text, default='')
|
|
profile = relationship('Profile')
|
|
|
|
class PlanSong(Base):
|
|
__tablename__ = 'plan_songs'
|
|
id = Column(Integer, primary_key=True)
|
|
plan_id = Column(Integer, ForeignKey('plans.id'))
|
|
song_id = Column(String(200), ForeignKey('songs.id'))
|
|
order_index = Column(Integer, default=0)
|
|
plan = relationship('Plan')
|
|
song = relationship('Song')
|
|
|
|
class ProfileSong(Base):
|
|
__tablename__ = 'profile_songs'
|
|
id = Column(Integer, primary_key=True)
|
|
profile_id = Column(String(200), ForeignKey('profiles.id'))
|
|
song_id = Column(String(200), ForeignKey('songs.id'))
|
|
song_key = Column(String(10), default='C')
|
|
profile = relationship('Profile')
|
|
song = relationship('Song')
|
|
|
|
def init_db():
|
|
Base.metadata.create_all(engine)
|