From 841e10ae353e0b1b3d020a26d6cac6f37981550e Mon Sep 17 00:00:00 2001 From: Jacky Wu Date: Thu, 29 May 2025 13:09:35 -0700 Subject: [PATCH] fix: introduce PreciseTimestamp to fix mysql datetime precision issue. Copybara import of the project: -- c62a0a6da4317497b991f83d4d8561bdbe7292aa by Jacky W : -- 59c0606ac08ddb45ce469a4d1e1c6e515ef94df4 by Jacky W : fix: add cache_ok option to remove sa warning. -- 1922599075af935a63544762765d6f0e6224907a by Jacky W : chore: format code. COPYBARA_INTEGRATE_REVIEW=https://github.com/google/adk-python/pull/1001 from Colstuwjx:fix/issue-480-precise-mysql-timestamp 50e764fb9646e326ad0204ff7adb2a5b65bf875a PiperOrigin-RevId: 764853016 --- .../adk/sessions/database_session_service.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/google/adk/sessions/database_session_service.py b/src/google/adk/sessions/database_session_service.py index 7c64548..4d965de 100644 --- a/src/google/adk/sessions/database_session_service.py +++ b/src/google/adk/sessions/database_session_service.py @@ -92,6 +92,18 @@ class DynamicJSON(TypeDecorator): return value +class PreciseTimestamp(TypeDecorator): + """Represents a timestamp precise to the microsecond.""" + + impl = DateTime + cache_ok = True + + def load_dialect_impl(self, dialect): + if dialect.name == "mysql": + return dialect.type_descriptor(mysql.DATETIME(fsp=6)) + return self.impl + + class Base(DeclarativeBase): """Base class for database tables.""" @@ -156,7 +168,9 @@ class StorageEvent(Base): branch: Mapped[str] = mapped_column( String(DEFAULT_MAX_VARCHAR_LENGTH), nullable=True ) - timestamp: Mapped[DateTime] = mapped_column(DateTime(), default=func.now()) + timestamp: Mapped[PreciseTimestamp] = mapped_column( + PreciseTimestamp, default=func.now() + ) content: Mapped[dict[str, Any]] = mapped_column(DynamicJSON, nullable=True) actions: Mapped[MutableDict[str, Any]] = mapped_column(PickleType)