Skip to content

Commit

Permalink
Types: Accept marshalling datetime.date values on DateTime fields
Browse files Browse the repository at this point in the history
The test suite of `meltano-tap-cratedb`, derived from the corresponding
PostgreSQL adapter, will supply `dt.date` objects. Without this patch,
those will otherwise fail on this routine.
  • Loading branch information
amotl committed Jun 22, 2024
1 parent 4fb90ac commit ca58576
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
## Unreleased
- Added/reactivated documentation as `sqlalchemy-cratedb`
- Unlocking supporting timezone-aware `DateTime` fields
- Accept marshalling Python `datetime.date` values on `sa.DateTime` fields

## 2024/06/13 0.37.0
- Added support for CrateDB's [FLOAT_VECTOR] data type and its accompanying
Expand Down
6 changes: 3 additions & 3 deletions src/sqlalchemy_cratedb/dialect.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,10 @@ class DateTime(sqltypes.DateTime):

def bind_processor(self, dialect):
def process(value):
if value is not None:
assert isinstance(value, datetime)
if isinstance(value, (datetime, date)):
return value.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
return value
else:
return value
return process

def result_processor(self, dialect, coltype):
Expand Down
27 changes: 27 additions & 0 deletions tests/datetime_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,30 @@ def test_datetime_tz(session):
assert result["datetime"].tzname() is None
assert result["datetime"].timetz() == dt.time(19, 19, 30)
assert result["datetime"].tzinfo is None


def test_datetime_date(session):
"""
Validate assigning a `date` object to a `datetime` column works.
It is needed by meltano-tap-cratedb.
The test suite of `meltano-tap-cratedb`, derived from the corresponding
PostgreSQL adapter, will supply `dt.date` objects. Without this improvement,
those will otherwise fail.
"""

# Insert record.
foo_item = FooBar(
name="foo",
datetime=dt.date(2009, 5, 13),
)
session.add(foo_item)
session.commit()
session.execute(sa.text("REFRESH TABLE foobar"))

# Query record.
result = session.execute(sa.select(FooBar.name, FooBar.date, FooBar.datetime)).mappings().first()

# Compare outcome.
assert result["datetime"] == dt.datetime(2009, 5, 13, 0, 0, 0)

0 comments on commit ca58576

Please sign in to comment.