fix: add date type coercion logic for CSV importer

This commit is contained in:
Lance Edgar 2026-01-06 19:34:51 -06:00
parent 30f119ffc7
commit dec145ada5
2 changed files with 32 additions and 1 deletions

View file

@ -391,6 +391,10 @@ def make_coercer(attr): # pylint: disable=too-many-return-statements
):
return coerce_datetime
# Date
if isinstance(attr.type, sa.Date):
return coerce_date
# Float
# nb. check this before decimal, since Numeric inherits from Float
if isinstance(attr.type, sa.Float):
@ -423,6 +427,13 @@ def coerce_boolean_nullable(value): # pylint: disable=missing-function-docstrin
return coerce_boolean(value)
def coerce_date(value): # pylint: disable=missing-function-docstring
if value == "":
return None
return datetime.datetime.strptime(value, "%Y-%m-%d").date()
def coerce_datetime(value): # pylint: disable=missing-function-docstring
if value == "":
return None

View file

@ -271,6 +271,9 @@ class Example(Base):
flag = sa.Column(sa.Boolean(), nullable=False)
optional_flag = sa.Column(sa.Boolean(), nullable=True)
date = sa.Column(sa.Date(), nullable=False)
optional_date = sa.Column(sa.Date(), nullable=True)
dt = sa.Column(sa.DateTime(), nullable=False)
optional_dt = sa.Column(sa.DateTime(), nullable=True)
@ -285,7 +288,7 @@ class TestMakeCoercers(TestCase):
def test_basic(self):
coercers = mod.make_coercers(Example)
self.assertEqual(len(coercers), 12)
self.assertEqual(len(coercers), 14)
self.assertIs(coercers["id"], mod.coerce_integer)
self.assertIs(coercers["optional_id"], mod.coerce_integer)
@ -293,6 +296,8 @@ class TestMakeCoercers(TestCase):
self.assertIs(coercers["optional_name"], mod.coerce_string_nullable)
self.assertIs(coercers["flag"], mod.coerce_boolean)
self.assertIs(coercers["optional_flag"], mod.coerce_boolean_nullable)
self.assertIs(coercers["date"], mod.coerce_date)
self.assertIs(coercers["optional_date"], mod.coerce_date)
self.assertIs(coercers["dt"], mod.coerce_datetime)
self.assertIs(coercers["optional_dt"], mod.coerce_datetime)
self.assertIs(coercers["dec"], mod.coerce_decimal)
@ -322,6 +327,12 @@ class TestMakeCoercer(TestCase):
func = mod.make_coercer(Example.optional_flag)
self.assertIs(func, mod.coerce_boolean_nullable)
func = mod.make_coercer(Example.date)
self.assertIs(func, mod.coerce_date)
func = mod.make_coercer(Example.optional_date)
self.assertIs(func, mod.coerce_date)
func = mod.make_coercer(Example.dt)
self.assertIs(func, mod.coerce_datetime)
@ -365,6 +376,15 @@ class TestCoercers(TestCase):
self.assertIsNone(mod.coerce_boolean_nullable(""))
def test_coerce_date(self):
self.assertIsNone(mod.coerce_date(""))
value = mod.coerce_date("2025-10-19")
self.assertIsInstance(value, datetime.date)
self.assertEqual(value, datetime.date(2025, 10, 19))
self.assertRaises(ValueError, mod.coerce_date, "XXX")
def test_coerce_datetime(self):
self.assertIsNone(mod.coerce_datetime(""))