fix: Handle date conversion for string dates in data transformer

When resuming migration, EventDate may be a string (from PostgreSQL queries)
instead of a datetime.date object (from MySQL). The combine() function expects
a datetime.date object, so we now convert strings to dates before combining
with time.

Added _convert_date() helper similar to _convert_time() that handles:
- str: Parse from "YYYY-MM-DD" format
- datetime.date: Return as-is
- datetime.datetime: Extract date component

Fixes error: "combine() argument 1 must be datetime.date, not str"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-23 18:52:42 +01:00
parent 262edd0ed2
commit eb315c90ff

View File

@@ -14,6 +14,30 @@ logger = get_logger(__name__)
class DataTransformer: class DataTransformer:
"""Transform MySQL data to PostgreSQL format.""" """Transform MySQL data to PostgreSQL format."""
@staticmethod
def _convert_date(event_date: Any) -> datetime.date:
"""Convert event_date to datetime.date object.
Handles multiple input types:
- str: Parse from "YYYY-MM-DD" format
- datetime.date: Return as-is
- datetime.datetime: Extract date component
Args:
event_date: Date value from MySQL (str or date)
Returns:
datetime.date object
"""
if isinstance(event_date, str):
return datetime.strptime(event_date, "%Y-%m-%d").date()
elif isinstance(event_date, datetime):
return event_date.date()
elif isinstance(event_date, datetime.date):
return event_date
else:
raise ValueError(f"Unsupported event_date type: {type(event_date)}")
@staticmethod @staticmethod
def _convert_time(event_time: Any) -> time: def _convert_time(event_time: Any) -> time:
"""Convert event_time to datetime.time object. """Convert event_time to datetime.time object.
@@ -95,8 +119,9 @@ class DataTransformer:
event_date = mysql_row.get("EventDate") event_date = mysql_row.get("EventDate")
event_time = mysql_row.get("EventTime") event_time = mysql_row.get("EventTime")
if event_date is not None and event_time is not None: if event_date is not None and event_time is not None:
event_date_obj = DataTransformer._convert_date(event_date)
event_time_obj = DataTransformer._convert_time(event_time) event_time_obj = DataTransformer._convert_time(event_time)
event_timestamp = datetime.combine(event_date, event_time_obj) event_timestamp = datetime.combine(event_date_obj, event_time_obj)
elif event_date is None or event_time is None: elif event_date is None or event_time is None:
# Log a warning for records with missing date/time # Log a warning for records with missing date/time
missing = [] missing = []
@@ -165,8 +190,9 @@ class DataTransformer:
event_date = mysql_row.get("EventDate") event_date = mysql_row.get("EventDate")
event_time = mysql_row.get("EventTime") event_time = mysql_row.get("EventTime")
if event_date is not None and event_time is not None: if event_date is not None and event_time is not None:
event_date_obj = DataTransformer._convert_date(event_date)
event_time_obj = DataTransformer._convert_time(event_time) event_time_obj = DataTransformer._convert_time(event_time)
event_timestamp = datetime.combine(event_date, event_time_obj) event_timestamp = datetime.combine(event_date_obj, event_time_obj)
elif event_date is None or event_time is None: elif event_date is None or event_time is None:
# Log a warning for records with missing date/time # Log a warning for records with missing date/time
missing = [] missing = []