Fix PostgreSQL upsert column names and CSV null handling

- Fix upsert_many() to use column_name for EXCLUDED references
  (ForeignKeyField columns end in _id, e.g., batter -> batter_id)
- Add null checks in batting/pitching CSV output for player, team, game
  fields to prevent 'NoneType' not subscriptable errors

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Cal Corum 2026-01-30 17:28:40 -06:00
parent 3dce457463
commit cb89a61196
2 changed files with 37 additions and 20 deletions

View File

@ -100,12 +100,15 @@ def upsert_many(
# Build conflict target - get actual field objects
conflict_target = [getattr(model, f) for f in conflict_fields]
# Build update dict
update_dict = {
getattr(model, f): EXCLUDED[f]
for f in update_fields
if hasattr(model, f)
}
# Build update dict - use column_name for EXCLUDED reference
# (ForeignKeyField column names end in _id, e.g., batter -> batter_id)
update_dict = {}
for f in update_fields:
if hasattr(model, f):
field_obj = getattr(model, f)
# Get the actual column name from the field
col_name = field_obj.column_name
update_dict[field_obj] = EXCLUDED[col_name]
if update_dict:
model.insert_many(batch).on_conflict(

View File

@ -782,17 +782,24 @@ async def get_batting_totals(
)
for x in return_vals:
x["player_id"] = x["player"]["player_id"]
x["player_name"] = x["player"]["p_name"]
x["player_cardset"] = x["player"]["cardset"]["name"]
x["team_id"] = x["team"]["id"]
x["team_abbrev"] = x["team"]["abbrev"]
if "id" in x["game"]:
x["player_id"] = x["player"]["player_id"] if x["player"] else None
x["player_name"] = x["player"]["p_name"] if x["player"] else None
x["player_cardset"] = (
x["player"]["cardset"]["name"]
if x["player"] and x["player"].get("cardset")
else None
)
x["team_id"] = x["team"]["id"] if x["team"] else None
x["team_abbrev"] = x["team"]["abbrev"] if x["team"] else None
if x.get("game") and isinstance(x["game"], dict) and "id" in x["game"]:
x["game_id"] = x["game"]["id"]
if "game_type" in x["game"]:
x["game_type"] = x["game"]["game_type"]
del x["game"]
del x["player"], x["team"]
if x.get("player"):
del x["player"]
if x.get("team"):
del x["team"]
output = pd.DataFrame(return_vals)
first = ["player_id", "player_name", "player_cardset", "team_id", "team_abbrev"]
@ -1174,17 +1181,24 @@ async def get_pitching_totals(
)
for x in return_vals:
x["player_id"] = x["player"]["player_id"]
x["player_name"] = x["player"]["p_name"]
x["player_cardset"] = x["player"]["cardset"]["name"]
x["team_id"] = x["team"]["id"]
x["team_abbrev"] = x["team"]["abbrev"]
if "id" in x["game"]:
x["player_id"] = x["player"]["player_id"] if x["player"] else None
x["player_name"] = x["player"]["p_name"] if x["player"] else None
x["player_cardset"] = (
x["player"]["cardset"]["name"]
if x["player"] and x["player"].get("cardset")
else None
)
x["team_id"] = x["team"]["id"] if x["team"] else None
x["team_abbrev"] = x["team"]["abbrev"] if x["team"] else None
if x.get("game") and isinstance(x["game"], dict) and "id" in x["game"]:
x["game_id"] = x["game"]["id"]
if "game_type" in x["game"]:
x["game_type"] = x["game"]["game_type"]
del x["game"]
del x["player"], x["team"]
if x.get("player"):
del x["player"]
if x.get("team"):
del x["team"]
output = pd.DataFrame(return_vals)
first = ["player_id", "player_name", "player_cardset", "team_id", "team_abbrev"]