From 9247189a37ab04ea690bb4dc0dad69c2481535dc Mon Sep 17 00:00:00 2001 From: Adam Sachs Date: Wed, 1 May 2024 13:54:21 -0400 Subject: [PATCH] attempt to handle datetimes in sqlalchemy json serialization --- src/fides/api/db/__init__.py | 15 +++++++++++++++ src/fides/api/db/ctl_session.py | 2 ++ src/fides/api/db/session.py | 7 ++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/fides/api/db/__init__.py b/src/fides/api/db/__init__.py index e69de29bb2d..845cf256abd 100644 --- a/src/fides/api/db/__init__.py +++ b/src/fides/api/db/__init__.py @@ -0,0 +1,15 @@ +from datetime import date, datetime +from json import dumps + + +def default_serialize(obj): + """JSON serializer for objects not serializable by default json code""" + + if isinstance(obj, (datetime, date)): + return obj.isoformat() + raise TypeError("Type %s not serializable" % type(obj)) + + +def json_serializer(obj): + """JSON serializer that handles dates, to plug in for SQLAlchemy engine JSON serialization""" + return dumps(obj, default=default_serialize) diff --git a/src/fides/api/db/ctl_session.py b/src/fides/api/db/ctl_session.py index 017f09d118c..aed2705027f 100644 --- a/src/fides/api/db/ctl_session.py +++ b/src/fides/api/db/ctl_session.py @@ -5,6 +5,7 @@ from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import sessionmaker +from fides.api.db import json_serializer from fides.api.db.session import ExtendedSession from fides.config import CONFIG @@ -31,6 +32,7 @@ echo=False, hide_parameters=not CONFIG.dev_mode, logging_name="SyncEngine", + json_serializer=json_serializer, ) sync_session = sessionmaker( sync_engine, diff --git a/src/fides/api/db/session.py b/src/fides/api/db/session.py index 16f32aac1ff..b5084648427 100644 --- a/src/fides/api/db/session.py +++ b/src/fides/api/db/session.py @@ -7,6 +7,7 @@ from sqlalchemy.orm import Session, sessionmaker from fides.api.common_exceptions import MissingConfig +from fides.api.db import json_serializer from fides.config import FidesConfig @@ -32,7 +33,11 @@ def get_db_engine( else: database_uri = config.database.sqlalchemy_database_uri return create_engine( - database_uri, pool_pre_ping=True, pool_size=pool_size, max_overflow=max_overflow + database_uri, + pool_pre_ping=True, + pool_size=pool_size, + max_overflow=max_overflow, + json_serializer=json_serializer, )