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:
Cal Corum 2025-11-07 10:23:14 -06:00
parent db0635b01d
commit f6e8aa7108
3 changed files with 1198 additions and 10 deletions

1050
POSTGRES_MIGRATION_PLAN.md Normal file

File diff suppressed because it is too large Load Diff

View File

@ -9,14 +9,33 @@ from peewee import *
from peewee import ModelSelect
from playhouse.shortcuts import model_to_dict
db = SqliteDatabase(
# 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={
'journal_mode': 'wal',
'cache_size': -1 * 64000,
'synchronous': 0
}
)
)
date = f'{datetime.now().year}-{datetime.now().month}-{datetime.now().day}'
log_level = logging.INFO if os.environ.get('LOG_LEVEL') == 'INFO' else 'WARN'
@ -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])

View File

@ -1,8 +1,11 @@
from playhouse.migrate import *
import db_engine
# db = SqliteDatabase('pd_database.db')
migrator = SqliteMigrator(db_engine.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])