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:
@@ -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 = []
|
||||||
|
|||||||
Reference in New Issue
Block a user