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 peewee import ModelSelect
|
||||||
from playhouse.shortcuts import model_to_dict
|
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(
|
db = SqliteDatabase(
|
||||||
'storage/pd_master.db',
|
'storage/pd_master.db',
|
||||||
pragmas={
|
pragmas={
|
||||||
@ -155,6 +174,10 @@ class Current(BaseModel):
|
|||||||
gsheet_version = CharField()
|
gsheet_version = CharField()
|
||||||
live_scoreboard = IntegerField()
|
live_scoreboard = IntegerField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'current'
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def latest():
|
def latest():
|
||||||
latest_current = Current.select().order_by(-Current.id).get()
|
latest_current = Current.select().order_by(-Current.id).get()
|
||||||
@ -169,6 +192,10 @@ class Rarity(BaseModel):
|
|||||||
name = CharField(unique=True)
|
name = CharField(unique=True)
|
||||||
color = CharField()
|
color = CharField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'rarity'
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
@ -184,6 +211,10 @@ class Event(BaseModel):
|
|||||||
thumbnail = CharField(null=True)
|
thumbnail = CharField(null=True)
|
||||||
active = BooleanField(default=False)
|
active = BooleanField(default=False)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'event'
|
||||||
|
|
||||||
|
|
||||||
db.create_tables([Event])
|
db.create_tables([Event])
|
||||||
|
|
||||||
@ -197,6 +228,10 @@ class Cardset(BaseModel):
|
|||||||
in_packs = BooleanField(default=True)
|
in_packs = BooleanField(default=True)
|
||||||
ranked_legal = BooleanField(default=True)
|
ranked_legal = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'cardset'
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
@ -213,6 +248,10 @@ class MlbPlayer(BaseModel):
|
|||||||
key_mlbam = IntegerField(null=True)
|
key_mlbam = IntegerField(null=True)
|
||||||
offense_col = IntegerField(default=1)
|
offense_col = IntegerField(default=1)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'mlbplayer'
|
||||||
|
|
||||||
|
|
||||||
db.create_tables([MlbPlayer])
|
db.create_tables([MlbPlayer])
|
||||||
|
|
||||||
@ -310,6 +349,10 @@ class Player(BaseModel):
|
|||||||
logging.info(f'{self.p_name} cost now: {self.cost}')
|
logging.info(f'{self.p_name} cost now: {self.cost}')
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'player'
|
||||||
|
|
||||||
|
|
||||||
db.create_tables([Player])
|
db.create_tables([Player])
|
||||||
|
|
||||||
@ -364,6 +407,10 @@ class Team(BaseModel):
|
|||||||
logging.info(f'string: {hash_string}')
|
logging.info(f'string: {hash_string}')
|
||||||
return hash_string
|
return hash_string
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'team'
|
||||||
|
|
||||||
|
|
||||||
db.create_tables([Team])
|
db.create_tables([Team])
|
||||||
|
|
||||||
@ -375,6 +422,10 @@ class PackType(BaseModel):
|
|||||||
cost = IntegerField()
|
cost = IntegerField()
|
||||||
available = BooleanField(default=True)
|
available = BooleanField(default=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'packtype'
|
||||||
|
|
||||||
|
|
||||||
db.create_tables([PackType])
|
db.create_tables([PackType])
|
||||||
|
|
||||||
@ -386,6 +437,10 @@ class Pack(BaseModel):
|
|||||||
pack_cardset = ForeignKeyField(Cardset, null=True)
|
pack_cardset = ForeignKeyField(Cardset, null=True)
|
||||||
open_time = DateTimeField(null=True)
|
open_time = DateTimeField(null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'pack'
|
||||||
|
|
||||||
|
|
||||||
db.create_tables([Pack])
|
db.create_tables([Pack])
|
||||||
|
|
||||||
@ -406,6 +461,10 @@ class Card(BaseModel):
|
|||||||
def select_season(season):
|
def select_season(season):
|
||||||
return Card.select().join(Team).where(Card.team.season == season)
|
return Card.select().join(Team).where(Card.team.season == season)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'card'
|
||||||
|
|
||||||
|
|
||||||
db.create_tables([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.card21, this_roster.card22, this_roster.card23, this_roster.card24, this_roster.card25,
|
||||||
# this_roster.card26]
|
# this_roster.card26]
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'roster'
|
||||||
|
|
||||||
|
|
||||||
class Result(BaseModel):
|
class Result(BaseModel):
|
||||||
away_team = ForeignKeyField(Team)
|
away_team = ForeignKeyField(Team)
|
||||||
@ -477,6 +540,10 @@ class Result(BaseModel):
|
|||||||
season = Current.get().season
|
season = Current.get().season
|
||||||
return Result.select().where(Result.season == season)
|
return Result.select().where(Result.season == season)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'result'
|
||||||
|
|
||||||
|
|
||||||
class BattingStat(BaseModel):
|
class BattingStat(BaseModel):
|
||||||
card = ForeignKeyField(Card)
|
card = ForeignKeyField(Card)
|
||||||
@ -516,6 +583,10 @@ class BattingStat(BaseModel):
|
|||||||
created = DateTimeField()
|
created = DateTimeField()
|
||||||
game_id = IntegerField()
|
game_id = IntegerField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'battingstat'
|
||||||
|
|
||||||
|
|
||||||
class PitchingStat(BaseModel):
|
class PitchingStat(BaseModel):
|
||||||
card = ForeignKeyField(Card)
|
card = ForeignKeyField(Card)
|
||||||
@ -546,6 +617,10 @@ class PitchingStat(BaseModel):
|
|||||||
created = DateTimeField()
|
created = DateTimeField()
|
||||||
game_id = IntegerField()
|
game_id = IntegerField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'pitchingstat'
|
||||||
|
|
||||||
|
|
||||||
class Award(BaseModel):
|
class Award(BaseModel):
|
||||||
name = CharField()
|
name = CharField()
|
||||||
@ -555,12 +630,20 @@ class Award(BaseModel):
|
|||||||
team = ForeignKeyField(Team, null=True)
|
team = ForeignKeyField(Team, null=True)
|
||||||
image = CharField(null=True)
|
image = CharField(null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'award'
|
||||||
|
|
||||||
|
|
||||||
class Paperdex(BaseModel):
|
class Paperdex(BaseModel):
|
||||||
team = ForeignKeyField(Team)
|
team = ForeignKeyField(Team)
|
||||||
player = ForeignKeyField(Player)
|
player = ForeignKeyField(Player)
|
||||||
created = DateTimeField(default=int(datetime.timestamp(datetime.now())*1000))
|
created = DateTimeField(default=int(datetime.timestamp(datetime.now())*1000))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'paperdex'
|
||||||
|
|
||||||
# def add_to_paperdex(self, team, cards: list):
|
# def add_to_paperdex(self, team, cards: list):
|
||||||
# for x in players:
|
# for x in players:
|
||||||
# if not isinstance(x, Card):
|
# if not isinstance(x, Card):
|
||||||
@ -576,6 +659,10 @@ class Reward(BaseModel):
|
|||||||
team = ForeignKeyField(Team)
|
team = ForeignKeyField(Team)
|
||||||
created = DateTimeField()
|
created = DateTimeField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'reward'
|
||||||
|
|
||||||
|
|
||||||
class GameRewards(BaseModel):
|
class GameRewards(BaseModel):
|
||||||
name = CharField()
|
name = CharField()
|
||||||
@ -583,6 +670,10 @@ class GameRewards(BaseModel):
|
|||||||
player = ForeignKeyField(Player, null=True)
|
player = ForeignKeyField(Player, null=True)
|
||||||
money = IntegerField(null=True)
|
money = IntegerField(null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'gamerewards'
|
||||||
|
|
||||||
|
|
||||||
class Notification(BaseModel):
|
class Notification(BaseModel):
|
||||||
created = DateTimeField()
|
created = DateTimeField()
|
||||||
@ -593,6 +684,10 @@ class Notification(BaseModel):
|
|||||||
about = CharField() # f'{Topic}-{Object ID}'
|
about = CharField() # f'{Topic}-{Object ID}'
|
||||||
ack = BooleanField(default=False)
|
ack = BooleanField(default=False)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'notification'
|
||||||
|
|
||||||
|
|
||||||
class GauntletReward(BaseModel):
|
class GauntletReward(BaseModel):
|
||||||
name = CharField()
|
name = CharField()
|
||||||
@ -601,6 +696,10 @@ class GauntletReward(BaseModel):
|
|||||||
win_num = IntegerField()
|
win_num = IntegerField()
|
||||||
loss_max = IntegerField(default=1)
|
loss_max = IntegerField(default=1)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'gauntletreward'
|
||||||
|
|
||||||
|
|
||||||
class GauntletRun(BaseModel):
|
class GauntletRun(BaseModel):
|
||||||
team = ForeignKeyField(Team)
|
team = ForeignKeyField(Team)
|
||||||
@ -611,6 +710,10 @@ class GauntletRun(BaseModel):
|
|||||||
created = DateTimeField(default=int(datetime.timestamp(datetime.now())*1000))
|
created = DateTimeField(default=int(datetime.timestamp(datetime.now())*1000))
|
||||||
ended = DateTimeField(default=0)
|
ended = DateTimeField(default=0)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'gauntletrun'
|
||||||
|
|
||||||
|
|
||||||
db.create_tables([
|
db.create_tables([
|
||||||
Roster, BattingStat, PitchingStat, Result, Award, Paperdex, Reward, GameRewards, Notification, GauntletReward,
|
Roster, BattingStat, PitchingStat, Result, Award, Paperdex, Reward, GameRewards, Notification, GauntletReward,
|
||||||
@ -631,6 +734,10 @@ class BattingCard(BaseModel):
|
|||||||
offense_col = IntegerField()
|
offense_col = IntegerField()
|
||||||
hand = CharField(default='R')
|
hand = CharField(default='R')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'battingcard'
|
||||||
|
|
||||||
|
|
||||||
bc_index = ModelIndex(BattingCard, (BattingCard.player, BattingCard.variant), unique=True)
|
bc_index = ModelIndex(BattingCard, (BattingCard.player, BattingCard.variant), unique=True)
|
||||||
BattingCard.add_index(bc_index)
|
BattingCard.add_index(bc_index)
|
||||||
@ -668,6 +775,10 @@ class BattingCardRatings(BaseModel):
|
|||||||
obp = FloatField(null=True)
|
obp = FloatField(null=True)
|
||||||
slg = FloatField(null=True)
|
slg = FloatField(null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'battingcardratings'
|
||||||
|
|
||||||
|
|
||||||
bcr_index = ModelIndex(
|
bcr_index = ModelIndex(
|
||||||
BattingCardRatings, (BattingCardRatings.battingcard, BattingCardRatings.vs_hand), unique=True
|
BattingCardRatings, (BattingCardRatings.battingcard, BattingCardRatings.vs_hand), unique=True
|
||||||
@ -688,6 +799,10 @@ class PitchingCard(BaseModel):
|
|||||||
offense_col = IntegerField()
|
offense_col = IntegerField()
|
||||||
hand = CharField(default='R')
|
hand = CharField(default='R')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'pitchingcard'
|
||||||
|
|
||||||
|
|
||||||
pc_index = ModelIndex(PitchingCard, (PitchingCard.player, PitchingCard.variant), unique=True)
|
pc_index = ModelIndex(PitchingCard, (PitchingCard.player, PitchingCard.variant), unique=True)
|
||||||
PitchingCard.add_index(pc_index)
|
PitchingCard.add_index(pc_index)
|
||||||
@ -727,6 +842,10 @@ class PitchingCardRatings(BaseModel):
|
|||||||
obp = FloatField(null=True)
|
obp = FloatField(null=True)
|
||||||
slg = FloatField(null=True)
|
slg = FloatField(null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'pitchingcardratings'
|
||||||
|
|
||||||
|
|
||||||
pcr_index = ModelIndex(
|
pcr_index = ModelIndex(
|
||||||
PitchingCardRatings, (PitchingCardRatings.pitchingcard, PitchingCardRatings.vs_hand), unique=True
|
PitchingCardRatings, (PitchingCardRatings.pitchingcard, PitchingCardRatings.vs_hand), unique=True
|
||||||
@ -745,6 +864,10 @@ class CardPosition(BaseModel):
|
|||||||
pb = IntegerField(null=True)
|
pb = IntegerField(null=True)
|
||||||
overthrow = IntegerField(null=True)
|
overthrow = IntegerField(null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'cardposition'
|
||||||
|
|
||||||
|
|
||||||
pos_index = ModelIndex(
|
pos_index = ModelIndex(
|
||||||
CardPosition, (CardPosition.player, CardPosition.variant, CardPosition.position), unique=True
|
CardPosition, (CardPosition.player, CardPosition.variant, CardPosition.position), unique=True
|
||||||
@ -771,6 +894,10 @@ class StratGame(BaseModel):
|
|||||||
short_game = BooleanField(default=False)
|
short_game = BooleanField(default=False)
|
||||||
forfeit = BooleanField(default=False)
|
forfeit = BooleanField(default=False)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'stratgame'
|
||||||
|
|
||||||
|
|
||||||
class StratPlay(BaseModel):
|
class StratPlay(BaseModel):
|
||||||
game = ForeignKeyField(StratGame)
|
game = ForeignKeyField(StratGame)
|
||||||
@ -840,6 +967,10 @@ class StratPlay(BaseModel):
|
|||||||
is_tied = BooleanField(default=False)
|
is_tied = BooleanField(default=False)
|
||||||
is_new_inning = BooleanField(default=False)
|
is_new_inning = BooleanField(default=False)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'stratplay'
|
||||||
|
|
||||||
|
|
||||||
class Decision(BaseModel):
|
class Decision(BaseModel):
|
||||||
season = IntegerField()
|
season = IntegerField()
|
||||||
@ -858,6 +989,10 @@ class Decision(BaseModel):
|
|||||||
rest_required = IntegerField(default=0)
|
rest_required = IntegerField(default=0)
|
||||||
is_start = BooleanField(default=False)
|
is_start = BooleanField(default=False)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
database = db
|
||||||
|
table_name = 'decision'
|
||||||
|
|
||||||
|
|
||||||
db.create_tables([StratGame, StratPlay, Decision])
|
db.create_tables([StratGame, StratPlay, Decision])
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,10 @@
|
|||||||
from playhouse.migrate import *
|
from playhouse.migrate import *
|
||||||
import db_engine
|
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)
|
migrator = SqliteMigrator(db_engine.db)
|
||||||
|
|
||||||
# db_engine.db.create_tables([db_engine.PackTheme])
|
# db_engine.db.create_tables([db_engine.PackTheme])
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user