fix: add date type coercion logic for CSV importer
This commit is contained in:
parent
30f119ffc7
commit
dec145ada5
2 changed files with 32 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(""))
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue