CLAUDE: Add PostgreSQL support and table names to models
- Add environment-based PostgreSQL configuration to db_engine.py - Add table_name to all 30 models (Meta class) - Update db_migrations.py to auto-select migrator based on DB type - Add comprehensive PostgreSQL migration plan document
This commit is contained in:
parent
db0635b01d
commit
f6e8aa7108
1050
POSTGRES_MIGRATION_PLAN.md
Normal file
1050
POSTGRES_MIGRATION_PLAN.md
Normal file
File diff suppressed because it is too large
Load Diff
135
app/db_engine.py
135
app/db_engine.py
@ -9,6 +9,25 @@ from peewee import *
|
||||
from peewee import ModelSelect
|
||||
from playhouse.shortcuts import model_to_dict
|
||||
|
||||
# Database configuration - supports both SQLite and PostgreSQL
|
||||
DATABASE_TYPE = os.environ.get('DATABASE_TYPE', 'sqlite')
|
||||
|
||||
if DATABASE_TYPE.lower() == 'postgresql':
|
||||
from playhouse.pool import PooledPostgresqlDatabase
|
||||
db = PooledPostgresqlDatabase(
|
||||
os.environ.get('POSTGRES_DB', 'pd_master'),
|
||||
user=os.environ.get('POSTGRES_USER', 'pd_admin'),
|
||||
password=os.environ.get('POSTGRES_PASSWORD'),
|
||||
host=os.environ.get('POSTGRES_HOST', 'localhost'),
|
||||
port=int(os.environ.get('POSTGRES_PORT', '5432')),
|
||||
max_connections=20,
|
||||
stale_timeout=300, # 5 minutes
|
||||
timeout=0,
|
||||
autoconnect=True,
|
||||
autorollback=True # Automatically rollback failed transactions
|
||||
)
|
||||
else:
|
||||
# Default SQLite configuration for local development
|
||||
db = SqliteDatabase(
|
||||
'storage/pd_master.db',
|
||||
pragmas={
|
||||
@ -155,6 +174,10 @@ class Current(BaseModel):
|
||||
gsheet_version = CharField()
|
||||
live_scoreboard = IntegerField()
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'current'
|
||||
|
||||
@staticmethod
|
||||
def latest():
|
||||
latest_current = Current.select().order_by(-Current.id).get()
|
||||
@ -169,6 +192,10 @@ class Rarity(BaseModel):
|
||||
name = CharField(unique=True)
|
||||
color = CharField()
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'rarity'
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
@ -184,6 +211,10 @@ class Event(BaseModel):
|
||||
thumbnail = CharField(null=True)
|
||||
active = BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'event'
|
||||
|
||||
|
||||
db.create_tables([Event])
|
||||
|
||||
@ -197,6 +228,10 @@ class Cardset(BaseModel):
|
||||
in_packs = BooleanField(default=True)
|
||||
ranked_legal = BooleanField(default=True)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'cardset'
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
@ -213,6 +248,10 @@ class MlbPlayer(BaseModel):
|
||||
key_mlbam = IntegerField(null=True)
|
||||
offense_col = IntegerField(default=1)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'mlbplayer'
|
||||
|
||||
|
||||
db.create_tables([MlbPlayer])
|
||||
|
||||
@ -310,6 +349,10 @@ class Player(BaseModel):
|
||||
logging.info(f'{self.p_name} cost now: {self.cost}')
|
||||
self.save()
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'player'
|
||||
|
||||
|
||||
db.create_tables([Player])
|
||||
|
||||
@ -364,6 +407,10 @@ class Team(BaseModel):
|
||||
logging.info(f'string: {hash_string}')
|
||||
return hash_string
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'team'
|
||||
|
||||
|
||||
db.create_tables([Team])
|
||||
|
||||
@ -375,6 +422,10 @@ class PackType(BaseModel):
|
||||
cost = IntegerField()
|
||||
available = BooleanField(default=True)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'packtype'
|
||||
|
||||
|
||||
db.create_tables([PackType])
|
||||
|
||||
@ -386,6 +437,10 @@ class Pack(BaseModel):
|
||||
pack_cardset = ForeignKeyField(Cardset, null=True)
|
||||
open_time = DateTimeField(null=True)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'pack'
|
||||
|
||||
|
||||
db.create_tables([Pack])
|
||||
|
||||
@ -406,6 +461,10 @@ class Card(BaseModel):
|
||||
def select_season(season):
|
||||
return Card.select().join(Team).where(Card.team.season == season)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'card'
|
||||
|
||||
|
||||
db.create_tables([Card])
|
||||
|
||||
@ -454,6 +513,10 @@ class Roster(BaseModel):
|
||||
# this_roster.card21, this_roster.card22, this_roster.card23, this_roster.card24, this_roster.card25,
|
||||
# this_roster.card26]
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'roster'
|
||||
|
||||
|
||||
class Result(BaseModel):
|
||||
away_team = ForeignKeyField(Team)
|
||||
@ -477,6 +540,10 @@ class Result(BaseModel):
|
||||
season = Current.get().season
|
||||
return Result.select().where(Result.season == season)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'result'
|
||||
|
||||
|
||||
class BattingStat(BaseModel):
|
||||
card = ForeignKeyField(Card)
|
||||
@ -516,6 +583,10 @@ class BattingStat(BaseModel):
|
||||
created = DateTimeField()
|
||||
game_id = IntegerField()
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'battingstat'
|
||||
|
||||
|
||||
class PitchingStat(BaseModel):
|
||||
card = ForeignKeyField(Card)
|
||||
@ -546,6 +617,10 @@ class PitchingStat(BaseModel):
|
||||
created = DateTimeField()
|
||||
game_id = IntegerField()
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'pitchingstat'
|
||||
|
||||
|
||||
class Award(BaseModel):
|
||||
name = CharField()
|
||||
@ -555,12 +630,20 @@ class Award(BaseModel):
|
||||
team = ForeignKeyField(Team, null=True)
|
||||
image = CharField(null=True)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'award'
|
||||
|
||||
|
||||
class Paperdex(BaseModel):
|
||||
team = ForeignKeyField(Team)
|
||||
player = ForeignKeyField(Player)
|
||||
created = DateTimeField(default=int(datetime.timestamp(datetime.now())*1000))
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'paperdex'
|
||||
|
||||
# def add_to_paperdex(self, team, cards: list):
|
||||
# for x in players:
|
||||
# if not isinstance(x, Card):
|
||||
@ -576,6 +659,10 @@ class Reward(BaseModel):
|
||||
team = ForeignKeyField(Team)
|
||||
created = DateTimeField()
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'reward'
|
||||
|
||||
|
||||
class GameRewards(BaseModel):
|
||||
name = CharField()
|
||||
@ -583,6 +670,10 @@ class GameRewards(BaseModel):
|
||||
player = ForeignKeyField(Player, null=True)
|
||||
money = IntegerField(null=True)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'gamerewards'
|
||||
|
||||
|
||||
class Notification(BaseModel):
|
||||
created = DateTimeField()
|
||||
@ -593,6 +684,10 @@ class Notification(BaseModel):
|
||||
about = CharField() # f'{Topic}-{Object ID}'
|
||||
ack = BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'notification'
|
||||
|
||||
|
||||
class GauntletReward(BaseModel):
|
||||
name = CharField()
|
||||
@ -601,6 +696,10 @@ class GauntletReward(BaseModel):
|
||||
win_num = IntegerField()
|
||||
loss_max = IntegerField(default=1)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'gauntletreward'
|
||||
|
||||
|
||||
class GauntletRun(BaseModel):
|
||||
team = ForeignKeyField(Team)
|
||||
@ -611,6 +710,10 @@ class GauntletRun(BaseModel):
|
||||
created = DateTimeField(default=int(datetime.timestamp(datetime.now())*1000))
|
||||
ended = DateTimeField(default=0)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'gauntletrun'
|
||||
|
||||
|
||||
db.create_tables([
|
||||
Roster, BattingStat, PitchingStat, Result, Award, Paperdex, Reward, GameRewards, Notification, GauntletReward,
|
||||
@ -631,6 +734,10 @@ class BattingCard(BaseModel):
|
||||
offense_col = IntegerField()
|
||||
hand = CharField(default='R')
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'battingcard'
|
||||
|
||||
|
||||
bc_index = ModelIndex(BattingCard, (BattingCard.player, BattingCard.variant), unique=True)
|
||||
BattingCard.add_index(bc_index)
|
||||
@ -668,6 +775,10 @@ class BattingCardRatings(BaseModel):
|
||||
obp = FloatField(null=True)
|
||||
slg = FloatField(null=True)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'battingcardratings'
|
||||
|
||||
|
||||
bcr_index = ModelIndex(
|
||||
BattingCardRatings, (BattingCardRatings.battingcard, BattingCardRatings.vs_hand), unique=True
|
||||
@ -688,6 +799,10 @@ class PitchingCard(BaseModel):
|
||||
offense_col = IntegerField()
|
||||
hand = CharField(default='R')
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'pitchingcard'
|
||||
|
||||
|
||||
pc_index = ModelIndex(PitchingCard, (PitchingCard.player, PitchingCard.variant), unique=True)
|
||||
PitchingCard.add_index(pc_index)
|
||||
@ -727,6 +842,10 @@ class PitchingCardRatings(BaseModel):
|
||||
obp = FloatField(null=True)
|
||||
slg = FloatField(null=True)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'pitchingcardratings'
|
||||
|
||||
|
||||
pcr_index = ModelIndex(
|
||||
PitchingCardRatings, (PitchingCardRatings.pitchingcard, PitchingCardRatings.vs_hand), unique=True
|
||||
@ -745,6 +864,10 @@ class CardPosition(BaseModel):
|
||||
pb = IntegerField(null=True)
|
||||
overthrow = IntegerField(null=True)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'cardposition'
|
||||
|
||||
|
||||
pos_index = ModelIndex(
|
||||
CardPosition, (CardPosition.player, CardPosition.variant, CardPosition.position), unique=True
|
||||
@ -771,6 +894,10 @@ class StratGame(BaseModel):
|
||||
short_game = BooleanField(default=False)
|
||||
forfeit = BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'stratgame'
|
||||
|
||||
|
||||
class StratPlay(BaseModel):
|
||||
game = ForeignKeyField(StratGame)
|
||||
@ -840,6 +967,10 @@ class StratPlay(BaseModel):
|
||||
is_tied = BooleanField(default=False)
|
||||
is_new_inning = BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'stratplay'
|
||||
|
||||
|
||||
class Decision(BaseModel):
|
||||
season = IntegerField()
|
||||
@ -858,6 +989,10 @@ class Decision(BaseModel):
|
||||
rest_required = IntegerField(default=0)
|
||||
is_start = BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
table_name = 'decision'
|
||||
|
||||
|
||||
db.create_tables([StratGame, StratPlay, Decision])
|
||||
|
||||
|
||||
@ -1,7 +1,10 @@
|
||||
from playhouse.migrate import *
|
||||
import db_engine
|
||||
|
||||
# db = SqliteDatabase('pd_database.db')
|
||||
# Automatically select correct migrator based on database type
|
||||
if hasattr(db_engine.db, '__class__') and 'Postgres' in db_engine.db.__class__.__name__:
|
||||
migrator = PostgresqlMigrator(db_engine.db)
|
||||
else:
|
||||
migrator = SqliteMigrator(db_engine.db)
|
||||
|
||||
# db_engine.db.create_tables([db_engine.PackTheme])
|
||||
|
||||
Loading…
Reference in New Issue
Block a user