Repository: litestar-org/litestar

Issue:
StaticFilesConfig and virtual directories
I'm trying to write a ``FileSystemProtocol`` to load files from the package data using [importlib_resources](https://importlib-resources.readthedocs.io/en/latest/using.html#). But because ``directories`` is defined as ``DirectoryPath``, pydantic checks if the given directories exist in the local filesystem. 

This is not generally true, especially in any kind of virtual filesystem (e.g. a zipped package). I think this condition should be relaxed to support virtual filesystems.

https://github.com/starlite-api/starlite/blob/9bb6dcd57c10a591377cf8e3a537e9292566d5b9/starlite/config/static_files.py#L32


Discussion:
I agree. Do you want to submit a PR?

Resolving patch:
diff --git a/litestar/contrib/sqlalchemy/base.py b/litestar/contrib/sqlalchemy/base.py
--- a/litestar/contrib/sqlalchemy/base.py
+++ b/litestar/contrib/sqlalchemy/base.py
@@ -2,12 +2,12 @@
 from __future__ import annotations
 
 import re
-from datetime import date, datetime
+from datetime import date, datetime, timezone
 from typing import TYPE_CHECKING, Any, ClassVar, Protocol, TypeVar, runtime_checkable
 from uuid import UUID, uuid4
 
 from pydantic import AnyHttpUrl, AnyUrl, EmailStr
-from sqlalchemy import Date, DateTime, MetaData, Sequence, String
+from sqlalchemy import Date, MetaData, Sequence, String
 from sqlalchemy.event import listens_for
 from sqlalchemy.orm import (
     DeclarativeBase,
@@ -19,7 +19,7 @@
     registry,
 )
 
-from .types import GUID, BigIntIdentity, JsonB
+from .types import GUID, BigIntIdentity, DateTimeUTC, JsonB
 
 if TYPE_CHECKING:
     from sqlalchemy.sql import FromClause
@@ -65,8 +65,8 @@ def touch_updated_timestamp(session: Session, *_: Any) -> None:
             session.
     """
     for instance in session.dirty:
-        if hasattr(instance, "updated"):
-            instance.updated = datetime.now()  # noqa: DTZ005
+        if hasattr(instance, "updated_at"):
+            instance.updated = (datetime.now(timezone.utc),)
 
 
 @runtime_checkable
@@ -112,9 +112,15 @@ def id(cls) -> Mapped[int]:
 class AuditColumns:
     """Created/Updated At Fields Mixin."""
 
-    created: Mapped[datetime] = mapped_column(default=datetime.now)  # pyright: ignore
+    created_at: Mapped[datetime] = mapped_column(  # pyright: ignore
+        DateTimeUTC(timezone=True),
+        default=datetime.now(timezone.utc),
+    )
     """Date/time of instance creation."""
-    updated: Mapped[datetime] = mapped_column(default=datetime.now)  # pyright: ignore
+    updated_at: Mapped[datetime] = mapped_column(  # pyright: ignore
+        DateTimeUTC(timezone=True),
+        default=datetime.now(timezone.utc),
+    )
     """Date/time of instance last update."""
 
 
@@ -152,7 +158,7 @@ def create_registry() -> registry:
             AnyUrl: String,
             AnyHttpUrl: String,
             dict: JsonB,
-            datetime: DateTime,
+            datetime: DateTimeUTC,
             date: Date,
         },
     )
diff --git a/litestar/contrib/sqlalchemy/types.py b/litestar/contrib/sqlalchemy/types.py
--- a/litestar/contrib/sqlalchemy/types.py
+++ b/litestar/contrib/sqlalchemy/types.py
@@ -1,10 +1,11 @@
 from __future__ import annotations
 
+import datetime
 import uuid
 from base64 import b64decode
 from typing import TYPE_CHECKING, Any, cast
 
-from sqlalchemy import text, util
+from sqlalchemy import DateTime, text, util
 from sqlalchemy.dialects.oracle import BLOB as ORA_BLOB
 from sqlalchemy.dialects.oracle import RAW as ORA_RAW
 from sqlalchemy.dialects.postgresql import JSONB as PG_JSONB
@@ -145,6 +146,30 @@ def _set_table(self, column: Any, table: Any) -> None:
         table.append_constraint(e)
 
 
+class DateTimeUTC(TypeDecorator):
+    """Timezone Aware DateTime.
+
+    Ensure UTC is stored in the database and that TZ aware dates are returned for all dialects.
+    """
+
+    impl = DateTime(timezone=True)
+    cache_ok = True
+
+    def process_bind_param(self, value: datetime.datetime | None, dialect: Dialect) -> datetime.datetime | None:
+        if value is None:
+            return value
+        if not value.tzinfo:
+            raise TypeError("tzinfo is required")
+        return value.astimezone(datetime.timezone.utc)
+
+    def process_result_value(self, value: datetime.datetime | None, dialect: Dialect) -> datetime.datetime | None:
+        if value is None:
+            return value
+        if value.tzinfo is None:
+            return value.replace(tzinfo=datetime.timezone.utc)
+        return value
+
+
 BigIntIdentity = BigInteger().with_variant(Integer, "sqlite")
 """A ``BigInteger`` variant that reverts to an ``Integer`` for unsupported variants."""
 


Test patch:
diff --git a/litestar/contrib/repository/testing/generic_mock_repository.py b/litestar/contrib/repository/testing/generic_mock_repository.py
--- a/litestar/contrib/repository/testing/generic_mock_repository.py
+++ b/litestar/contrib/repository/testing/generic_mock_repository.py
@@ -35,8 +35,8 @@ class GenericAsyncMockRepository(AbstractAsyncRepository[ModelT], Generic[ModelT
     model_type: type[ModelT]
     match_fields: list[str] | str | None = None
 
-    _model_has_created: bool
-    _model_has_updated: bool
+    _model_has_created_at: bool
+    _model_has_updated_at: bool
 
     def __init__(
         self, id_factory: Callable[[], Any] = uuid4, tz: tzinfo = timezone.utc, allow_ids_on_add: bool = False, **_: Any
@@ -59,8 +59,8 @@ def __class_getitem__(cls: type[AsyncMockRepoT], item: type[ModelT]) -> type[Asy
             {
                 "collection": {},
                 "model_type": item,
-                "_model_has_created": hasattr(item, "created"),
-                "_model_has_updated": hasattr(item, "updated"),
+                "_model_has_created_at": hasattr(item, "created_at"),
+                "_model_has_updated_at": hasattr(item, "updated_at"),
             },
         )
 
@@ -72,10 +72,10 @@ def _now(self) -> datetime:
 
     def _update_audit_attributes(self, data: ModelT, now: datetime | None = None, do_created: bool = False) -> ModelT:
         now = now or self._now()
-        if self._model_has_updated:
-            data.updated = now  # type:ignore[attr-defined]
-        if self._model_has_updated and do_created:
-            data.created = now  # type:ignore[attr-defined]
+        if self._model_has_updated_at:
+            data.updated_at = now  # type:ignore[attr-defined]
+        if self._model_has_updated_at and do_created:
+            data.created_at = now  # type:ignore[attr-defined]
         return data
 
     async def add(self, data: ModelT) -> ModelT:
@@ -386,8 +386,8 @@ class GenericSyncMockRepository(AbstractSyncRepository[ModelT], Generic[ModelT])
     model_type: type[ModelT]
     match_fields: list[str] | str | None = None
 
-    _model_has_created: bool
-    _model_has_updated: bool
+    _model_has_created_at: bool
+    _model_has_updated_at: bool
 
     def __init__(
         self,
@@ -414,8 +414,8 @@ def __class_getitem__(cls: type[SyncMockRepoT], item: type[ModelT]) -> type[Sync
             {
                 "collection": {},
                 "model_type": item,
-                "_model_has_created": hasattr(item, "created"),
-                "_model_has_updated": hasattr(item, "updated"),
+                "_model_has_created_at": hasattr(item, "created_at"),
+                "_model_has_updated_at": hasattr(item, "updated_at"),
             },
         )
 
@@ -427,10 +427,10 @@ def _now(self) -> datetime:
 
     def _update_audit_attributes(self, data: ModelT, now: datetime | None = None, do_created: bool = False) -> ModelT:
         now = now or self._now()
-        if self._model_has_updated:
-            data.updated = now  # type:ignore[attr-defined]
-        if self._model_has_updated and do_created:
-            data.created = now  # type:ignore[attr-defined]
+        if self._model_has_updated_at:
+            data.updated_at = now  # type:ignore[attr-defined]
+        if self._model_has_updated_at and do_created:
+            data.created_at = now  # type:ignore[attr-defined]
         return data
 
     def add(self, data: ModelT) -> ModelT:
diff --git a/tests/contrib/sqlalchemy/models_bigint.py b/tests/contrib/sqlalchemy/models_bigint.py
--- a/tests/contrib/sqlalchemy/models_bigint.py
+++ b/tests/contrib/sqlalchemy/models_bigint.py
@@ -2,6 +2,7 @@
 from __future__ import annotations
 
 from datetime import date, datetime
+from typing import List
 
 from sqlalchemy import ForeignKey, String
 from sqlalchemy.orm import Mapped, mapped_column, relationship
@@ -15,6 +16,11 @@ class BigIntAuthor(BigIntAuditBase):
 
     name: Mapped[str] = mapped_column(String(length=100))  # pyright: ignore
     dob: Mapped[date] = mapped_column(nullable=True)  # pyright: ignore
+    books: Mapped[List[BigIntBook]] = relationship(  # pyright: ignore  # noqa: UP
+        lazy="selectin",
+        back_populates="author",
+        cascade="all, delete",
+    )
 
 
 class BigIntBook(BigIntBase):
@@ -22,7 +28,9 @@ class BigIntBook(BigIntBase):
 
     title: Mapped[str] = mapped_column(String(length=250))  # pyright: ignore
     author_id: Mapped[int] = mapped_column(ForeignKey("big_int_author.id"))  # pyright: ignore
-    author: Mapped[BigIntAuthor] = relationship(lazy="joined", innerjoin=True)  # pyright: ignore
+    author: Mapped[BigIntAuthor] = relationship(  # pyright: ignore
+        lazy="joined", innerjoin=True, back_populates="books"
+    )
 
 
 class BigIntEventLog(BigIntAuditBase):
diff --git a/tests/contrib/sqlalchemy/models_uuid.py b/tests/contrib/sqlalchemy/models_uuid.py
--- a/tests/contrib/sqlalchemy/models_uuid.py
+++ b/tests/contrib/sqlalchemy/models_uuid.py
@@ -1,7 +1,9 @@
 """Example domain objects for testing."""
+
 from __future__ import annotations
 
 from datetime import date, datetime
+from typing import List
 from uuid import UUID
 
 from sqlalchemy import ForeignKey, String
@@ -16,6 +18,11 @@ class UUIDAuthor(UUIDAuditBase):
 
     name: Mapped[str] = mapped_column(String(length=100))  # pyright: ignore
     dob: Mapped[date] = mapped_column(nullable=True)  # pyright: ignore
+    books: Mapped[List[UUIDBook]] = relationship(  # pyright: ignore  # noqa: UP
+        lazy="selectin",
+        back_populates="author",
+        cascade="all, delete",
+    )
 
 
 class UUIDBook(UUIDBase):
@@ -23,7 +30,7 @@ class UUIDBook(UUIDBase):
 
     title: Mapped[str] = mapped_column(String(length=250))  # pyright: ignore
     author_id: Mapped[UUID] = mapped_column(ForeignKey("uuid_author.id"))  # pyright: ignore
-    author: Mapped[UUIDAuthor] = relationship(lazy="joined", innerjoin=True)  # pyright: ignore
+    author: Mapped[UUIDAuthor] = relationship(lazy="joined", innerjoin=True, back_populates="books")  # pyright: ignore
 
 
 class UUIDEventLog(UUIDAuditBase):
diff --git a/tests/contrib/sqlalchemy/repository/conftest.py b/tests/contrib/sqlalchemy/repository/conftest.py
--- a/tests/contrib/sqlalchemy/repository/conftest.py
+++ b/tests/contrib/sqlalchemy/repository/conftest.py
@@ -53,15 +53,15 @@ def fx_raw_authors_uuid() -> list[dict[str, Any]]:
             "id": UUID("97108ac1-ffcb-411d-8b1e-d9183399f63b"),
             "name": "Agatha Christie",
             "dob": "1890-09-15",
-            "created": "2023-05-01T00:00:00",
-            "updated": "2023-05-11T00:00:00",
+            "created_at": "2023-05-01T00:00:00",
+            "updated_at": "2023-05-11T00:00:00",
         },
         {
             "id": "5ef29f3c-3560-4d15-ba6b-a2e5c721e4d2",
             "name": "Leo Tolstoy",
             "dob": "1828-09-09",
-            "created": "2023-03-01T00:00:00",
-            "updated": "2023-05-15T00:00:00",
+            "created_at": "2023-03-01T00:00:00",
+            "updated_at": "2023-05-15T00:00:00",
         },
     ]
 
@@ -87,8 +87,8 @@ def fx_raw_log_events_uuid() -> list[dict[str, Any]]:
             "id": "f34545b9-663c-4fce-915d-dd1ae9cea42a",
             "logged_at": "0001-01-01T00:00:00",
             "payload": {"foo": "bar", "baz": datetime.now()},
-            "created": "0001-01-01T00:00:00",
-            "updated": "0001-01-01T00:00:00",
+            "created_at": "0001-01-01T00:00:00",
+            "updated_at": "0001-01-01T00:00:00",
         },
     ]
 
@@ -101,15 +101,15 @@ def fx_raw_rules_uuid() -> list[dict[str, Any]]:
             "id": "f34545b9-663c-4fce-915d-dd1ae9cea42a",
             "name": "Initial loading rule.",
             "config": json.dumps({"url": "https://litestar.dev", "setting_123": 1}),
-            "created": "2023-01-01T00:00:00",
-            "updated": "2023-02-01T00:00:00",
+            "created_at": "2023-01-01T00:00:00",
+            "updated_at": "2023-02-01T00:00:00",
         },
         {
             "id": "f34545b9-663c-4fce-915d-dd1ae9cea34b",
             "name": "Secondary loading rule.",
             "config": {"url": "https://litestar.dev", "bar": "foo", "setting_123": 4},
-            "created": "2023-02-01T00:00:00",
-            "updated": "2023-02-01T00:00:00",
+            "created_at": "2023-02-01T00:00:00",
+            "updated_at": "2023-02-01T00:00:00",
         },
     ]
 
@@ -122,15 +122,15 @@ def fx_raw_authors_bigint() -> list[dict[str, Any]]:
             "id": 2023,
             "name": "Agatha Christie",
             "dob": "1890-09-15",
-            "created": "2023-05-01T00:00:00",
-            "updated": "2023-05-11T00:00:00",
+            "created_at": "2023-05-01T00:00:00",
+            "updated_at": "2023-05-11T00:00:00",
         },
         {
             "id": 2024,
             "name": "Leo Tolstoy",
             "dob": "1828-09-09",
-            "created": "2023-03-01T00:00:00",
-            "updated": "2023-05-15T00:00:00",
+            "created_at": "2023-03-01T00:00:00",
+            "updated_at": "2023-05-15T00:00:00",
         },
     ]
 
@@ -155,8 +155,8 @@ def fx_raw_log_events_bigint() -> list[dict[str, Any]]:
             "id": 2025,
             "logged_at": "0001-01-01T00:00:00",
             "payload": {"foo": "bar", "baz": datetime.now()},
-            "created": "0001-01-01T00:00:00",
-            "updated": "0001-01-01T00:00:00",
+            "created_at": "0001-01-01T00:00:00",
+            "updated_at": "0001-01-01T00:00:00",
         },
     ]
 
@@ -169,15 +169,15 @@ def fx_raw_rules_bigint() -> list[dict[str, Any]]:
             "id": 2025,
             "name": "Initial loading rule.",
             "config": json.dumps({"url": "https://litestar.dev", "setting_123": 1}),
-            "created": "2023-01-01T00:00:00",
-            "updated": "2023-02-01T00:00:00",
+            "created_at": "2023-01-01T00:00:00",
+            "updated_at": "2023-02-01T00:00:00",
         },
         {
             "id": 2024,
             "name": "Secondary loading rule.",
             "config": {"url": "https://litestar.dev", "bar": "foo", "setting_123": 4},
-            "created": "2023-02-01T00:00:00",
-            "updated": "2023-02-01T00:00:00",
+            "created_at": "2023-02-01T00:00:00",
+            "updated_at": "2023-02-01T00:00:00",
         },
     ]
 
diff --git a/tests/contrib/sqlalchemy/repository/test_bigint_async.py b/tests/contrib/sqlalchemy/repository/test_bigint_async.py
--- a/tests/contrib/sqlalchemy/repository/test_bigint_async.py
+++ b/tests/contrib/sqlalchemy/repository/test_bigint_async.py
@@ -2,7 +2,7 @@
 from __future__ import annotations
 
 import sys
-from datetime import datetime
+from datetime import datetime, timezone
 from typing import Any
 
 import pytest
@@ -15,6 +15,7 @@
 from tests.contrib.sqlalchemy.models_bigint import (
     AuthorAsyncRepository,
     BigIntAuthor,
+    BigIntBook,
     BigIntRule,
     BookAsyncRepository,
     RuleAsyncRepository,
@@ -35,11 +36,19 @@ async def seed_db(
 ) -> None:
     for raw_author in raw_authors_bigint:
         raw_author["dob"] = datetime.strptime(raw_author["dob"], "%Y-%m-%d").date()
-        raw_author["created"] = datetime.strptime(raw_author["created"], "%Y-%m-%dT%H:%M:%S")
-        raw_author["updated"] = datetime.strptime(raw_author["updated"], "%Y-%m-%dT%H:%M:%S")
+        raw_author["created_at"] = datetime.strptime(raw_author["created_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
+        raw_author["updated_at"] = datetime.strptime(raw_author["updated_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
     for raw_author in raw_rules_bigint:
-        raw_author["created"] = datetime.strptime(raw_author["created"], "%Y-%m-%dT%H:%M:%S")
-        raw_author["updated"] = datetime.strptime(raw_author["updated"], "%Y-%m-%dT%H:%M:%S")
+        raw_author["created_at"] = datetime.strptime(raw_author["created_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
+        raw_author["updated_at"] = datetime.strptime(raw_author["updated_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
 
     async with async_engine.begin() as conn:
         await conn.run_sync(base.orm_registry.metadata.drop_all)
@@ -85,7 +94,7 @@ async def test_repo_count_method(author_repo: AuthorAsyncRepository) -> None:
 async def test_repo_list_and_count_method(
     raw_authors_bigint: list[dict[str, Any]], author_repo: AuthorAsyncRepository
 ) -> None:
-    """Test SQLALchemy list with count in asyncpg.
+    """Test SQLALchemy list with count.
 
     Args:
         raw_authors_bigint (list[dict[str, Any]]): list of authors pre-seeded into the mock repository
@@ -99,7 +108,7 @@ async def test_repo_list_and_count_method(
 
 
 async def test_repo_list_and_count_method_empty(book_repo: BookAsyncRepository) -> None:
-    """Test SQLALchemy list with count in asyncpg.
+    """Test SQLALchemy list with count.
 
     Args:
         raw_authors_bigint (list[dict[str, Any]]): list of authors pre-seeded into the mock repository
@@ -112,6 +121,22 @@ async def test_repo_list_and_count_method_empty(book_repo: BookAsyncRepository)
     assert len(collection) == 0
 
 
+async def test_repo_created_updated(author_repo: AuthorAsyncRepository) -> None:
+    """Test SQLALchemy created_at - updated_at.
+
+    Args:
+        author_repo (AuthorAsyncRepository): The author mock repository
+    """
+    author = await author_repo.get_one(name="Agatha Christie")
+    assert author.created_at is not None
+    assert author.updated_at is not None
+    original_update_dt = author.updated_at
+
+    author.books.append(BigIntBook(title="Testing"))
+    author = await author_repo.update(author)
+    assert author.updated_at == original_update_dt
+
+
 async def test_repo_list_method(raw_authors_bigint: list[dict[str, Any]], author_repo: AuthorAsyncRepository) -> None:
     """Test SQLALchemy list.
 
@@ -329,13 +354,17 @@ async def test_repo_filter_before_after(author_repo: AuthorAsyncRepository) -> N
         author_repo (AuthorAsyncRepository): The author mock repository
     """
     before_filter = BeforeAfter(
-        field_name="created", before=datetime.strptime("2023-05-01T00:00:00", "%Y-%m-%dT%H:%M:%S"), after=None
+        field_name="created_at",
+        before=datetime.strptime("2023-05-01T00:00:00", "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc),
+        after=None,
     )
     existing_obj = await author_repo.list(before_filter)
     assert existing_obj[0].name == "Leo Tolstoy"
 
     after_filter = BeforeAfter(
-        field_name="created", after=datetime.strptime("2023-03-01T00:00:00", "%Y-%m-%dT%H:%M:%S"), before=None
+        field_name="created_at",
+        after=datetime.strptime("2023-03-01T00:00:00", "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc),
+        before=None,
     )
     existing_obj = await author_repo.list(after_filter)
     assert existing_obj[0].name == "Agatha Christie"
@@ -369,9 +398,9 @@ async def test_repo_filter_order_by(author_repo: AuthorAsyncRepository) -> None:
         author_repo (AuthorAsyncRepository): The author mock repository
     """
 
-    existing_obj = await author_repo.list(OrderBy(field_name="created", sort_order="desc"))
+    existing_obj = await author_repo.list(OrderBy(field_name="created_at", sort_order="desc"))
     assert existing_obj[0].name == "Agatha Christie"
-    existing_obj = await author_repo.list(OrderBy(field_name="created", sort_order="asc"))
+    existing_obj = await author_repo.list(OrderBy(field_name="created_at", sort_order="asc"))
     assert existing_obj[0].name == "Leo Tolstoy"
 
 
diff --git a/tests/contrib/sqlalchemy/repository/test_bigint_sync.py b/tests/contrib/sqlalchemy/repository/test_bigint_sync.py
--- a/tests/contrib/sqlalchemy/repository/test_bigint_sync.py
+++ b/tests/contrib/sqlalchemy/repository/test_bigint_sync.py
@@ -2,7 +2,7 @@
 from __future__ import annotations
 
 import sys
-from datetime import datetime
+from datetime import datetime, timezone
 from typing import Any
 
 import pytest
@@ -15,6 +15,7 @@
 from tests.contrib.sqlalchemy.models_bigint import (
     AuthorSyncRepository,
     BigIntAuthor,
+    BigIntBook,
     BigIntRule,
     BookSyncRepository,
     RuleSyncRepository,
@@ -35,11 +36,15 @@ def seed_db(
 ) -> None:
     for raw_author in raw_authors_bigint:
         raw_author["dob"] = datetime.strptime(raw_author["dob"], "%Y-%m-%d").date()
-        raw_author["created"] = datetime.strptime(raw_author["created"], "%Y-%m-%dT%H:%M:%S")
-        raw_author["updated"] = datetime.strptime(raw_author["updated"], "%Y-%m-%dT%H:%M:%S")
+        raw_author["created_at"] = datetime.strptime(raw_author["created_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
+        raw_author["updated_at"] = datetime.strptime(raw_author["updated_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
     for raw_rule in raw_rules_bigint:
-        raw_rule["created"] = datetime.strptime(raw_rule["created"], "%Y-%m-%dT%H:%M:%S")
-        raw_rule["updated"] = datetime.strptime(raw_rule["updated"], "%Y-%m-%dT%H:%M:%S")
+        raw_rule["created_at"] = datetime.strptime(raw_rule["created_at"], "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc)
+        raw_rule["updated_at"] = datetime.strptime(raw_rule["updated_at"], "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc)
 
     with engine.begin() as conn:
         base.orm_registry.metadata.drop_all(conn)
@@ -114,6 +119,22 @@ def test_repo_list_and_count_method_empty(book_repo: BookSyncRepository) -> None
     assert len(collection) == 0
 
 
+def test_repo_created_updated(author_repo: AuthorSyncRepository) -> None:
+    """Test SQLALchemy created_at - updated_at.
+
+    Args:
+        author_repo (AuthorAsyncRepository): The author mock repository
+    """
+    author = author_repo.get_one(name="Agatha Christie")
+    assert author.created_at is not None
+    assert author.updated_at is not None
+    original_update_dt = author.updated_at
+
+    author.books.append(BigIntBook(title="Testing"))
+    author = author_repo.update(author)
+    assert author.updated_at == original_update_dt
+
+
 def test_repo_list_method(raw_authors_bigint: list[dict[str, Any]], author_repo: AuthorSyncRepository) -> None:
     """Test SQLALchemy list.
 
@@ -329,13 +350,17 @@ def test_repo_filter_before_after(author_repo: AuthorSyncRepository) -> None:
         author_repo (AuthorSyncRepository): The author mock repository
     """
     before_filter = BeforeAfter(
-        field_name="created", before=datetime.strptime("2023-05-01T00:00:00", "%Y-%m-%dT%H:%M:%S"), after=None
+        field_name="created_at",
+        before=datetime.strptime("2023-05-01T00:00:00", "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc),
+        after=None,
     )
     existing_obj = author_repo.list(before_filter)
     assert existing_obj[0].name == "Leo Tolstoy"
 
     after_filter = BeforeAfter(
-        field_name="created", after=datetime.strptime("2023-03-01T00:00:00", "%Y-%m-%dT%H:%M:%S"), before=None
+        field_name="created_at",
+        after=datetime.strptime("2023-03-01T00:00:00", "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc),
+        before=None,
     )
     existing_obj = author_repo.list(after_filter)
     assert existing_obj[0].name == "Agatha Christie"
@@ -369,9 +394,9 @@ def test_repo_filter_order_by(author_repo: AuthorSyncRepository) -> None:
         author_repo (AuthorSyncRepository): The author mock repository
     """
 
-    existing_obj = author_repo.list(OrderBy(field_name="created", sort_order="desc"))
+    existing_obj = author_repo.list(OrderBy(field_name="created_at", sort_order="desc"))
     assert existing_obj[0].name == "Agatha Christie"
-    existing_obj = author_repo.list(OrderBy(field_name="created", sort_order="asc"))
+    existing_obj = author_repo.list(OrderBy(field_name="created_at", sort_order="asc"))
     assert existing_obj[0].name == "Leo Tolstoy"
 
 
diff --git a/tests/contrib/sqlalchemy/repository/test_generic_mock_async_repository.py b/tests/contrib/sqlalchemy/repository/test_generic_mock_async_repository.py
--- a/tests/contrib/sqlalchemy/repository/test_generic_mock_async_repository.py
+++ b/tests/contrib/sqlalchemy/repository/test_generic_mock_async_repository.py
@@ -18,7 +18,7 @@
 def fx_authors() -> list[UUIDAuthor]:
     """Collection of Author models."""
     return [
-        UUIDAuthor(id=uuid4(), name=name, dob=dob, created=datetime.min, updated=datetime.min)
+        UUIDAuthor(id=uuid4(), name=name, dob=dob, created_at=datetime.min, updated_at=datetime.min)
         for name, dob in [("Agatha Christie", date(1890, 9, 15)), ("Leo Tolstoy", date(1828, 9, 9))]
     ]
 
@@ -113,36 +113,36 @@ def test_generic_mock_repository_raises_repository_exception_if_named_attribute_
 
 
 async def test_sets_created_updated_on_add() -> None:
-    """Test that the repository updates the 'created' and 'updated' timestamps
+    """Test that the repository updates the 'created_at' and 'updated_at' timestamps
     if necessary."""
 
     class UUIDModel(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     uuid_instance = UUIDModel()
-    assert "created" not in vars(uuid_instance)
-    assert "updated" not in vars(uuid_instance)
+    assert "created_at" not in vars(uuid_instance)
+    assert "updated_at" not in vars(uuid_instance)
 
     uuid_instance = await GenericAsyncMockRepository[UUIDModel]().add(uuid_instance)
-    assert "created" in vars(uuid_instance)
-    assert "updated" in vars(uuid_instance)
+    assert "created_at" in vars(uuid_instance)
+    assert "updated_at" in vars(uuid_instance)
 
     bigint_instance = BigIntModel()
-    assert "created" not in vars(bigint_instance)
-    assert "updated" not in vars(bigint_instance)
+    assert "created_at" not in vars(bigint_instance)
+    assert "updated_at" not in vars(bigint_instance)
 
     bigint_instance = await GenericAsyncMockRepository[BigIntModel]().add(bigint_instance)  # type: ignore[type-var]
-    assert "created" in vars(bigint_instance)
-    assert "updated" in vars(bigint_instance)
+    assert "created_at" in vars(bigint_instance)
+    assert "updated_at" in vars(bigint_instance)
 
 
 async def test_sets_updated_on_update(author_repository: GenericAsyncMockRepository[UUIDAuthor]) -> None:
@@ -150,9 +150,9 @@ async def test_sets_updated_on_update(author_repository: GenericAsyncMockReposit
     necessary."""
 
     instance = list(author_repository.collection.values())[0]
-    original_updated = instance.updated
+    original_updated = instance.updated_at
     instance = await author_repository.update(instance)
-    assert instance.updated > original_updated
+    assert instance.updated_at > original_updated
 
 
 async def test_does_not_set_created_updated() -> None:
@@ -160,51 +160,51 @@ async def test_does_not_set_created_updated() -> None:
     appropriate."""
 
     class UUIDModel(base.UUIDBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     uuid_instance = UUIDModel()
     uuid_repo = GenericAsyncMockRepository[UUIDModel]()
-    assert "created" not in vars(uuid_instance)
-    assert "updated" not in vars(uuid_instance)
+    assert "created_at" not in vars(uuid_instance)
+    assert "updated_at" not in vars(uuid_instance)
     uuid_instance = await uuid_repo.add(uuid_instance)
-    assert "created" not in vars(uuid_instance)
-    assert "updated" not in vars(uuid_instance)
+    assert "created_at" not in vars(uuid_instance)
+    assert "updated_at" not in vars(uuid_instance)
     uuid_instance = await uuid_repo.update(uuid_instance)
-    assert "created" not in vars(uuid_instance)
-    assert "updated" not in vars(uuid_instance)
+    assert "created_at" not in vars(uuid_instance)
+    assert "updated_at" not in vars(uuid_instance)
 
     bigint_instance = BigIntModel()
     bigint_repo = GenericAsyncMockRepository[BigIntModel]()  # type: ignore[type-var]
-    assert "created" not in vars(bigint_instance)
-    assert "updated" not in vars(bigint_instance)
+    assert "created_at" not in vars(bigint_instance)
+    assert "updated_at" not in vars(bigint_instance)
     bigint_instance = await bigint_repo.add(bigint_instance)
-    assert "created" not in vars(bigint_instance)
-    assert "updated" not in vars(bigint_instance)
+    assert "created_at" not in vars(bigint_instance)
+    assert "updated_at" not in vars(bigint_instance)
     bigint_instance = await bigint_repo.update(bigint_instance)
-    assert "created" not in vars(bigint_instance)
-    assert "updated" not in vars(bigint_instance)
+    assert "created_at" not in vars(bigint_instance)
+    assert "updated_at" not in vars(bigint_instance)
 
 
 async def test_add() -> None:
     """Test that the repository add method works correctly`."""
 
     class UUIDModel(base.UUIDBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -224,13 +224,13 @@ async def test_add_many() -> None:
     """Test that the repository add_many method works correctly`."""
 
     class UUIDModel(base.UUIDBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -249,7 +249,7 @@ async def test_update() -> None:
     """Test that the repository update method works correctly`."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -267,7 +267,7 @@ async def test_update_many() -> None:
     """Test that the repository add_many method works correctly`."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -287,7 +287,7 @@ async def test_upsert() -> None:
     """Test that the repository upsert method works correctly`."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -305,7 +305,7 @@ async def test_list() -> None:
     """Test that the repository list returns records."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -320,7 +320,7 @@ async def test_delete() -> None:
     """Test that the repository delete functionality."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -337,7 +337,7 @@ async def test_delete_many() -> None:
     """Test that the repository delete many functionality."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -354,7 +354,7 @@ async def test_list_and_count() -> None:
     """Test that the repository list_and_count returns records and the total record count."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -371,7 +371,7 @@ async def test_exists() -> None:
     """Test that the repository exists returns booleans."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -387,7 +387,7 @@ async def test_count() -> None:
     """Test that the repository count returns the total record count."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -403,7 +403,7 @@ async def test_get() -> None:
     """Test that the repository get returns a model record correctly."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -420,7 +420,7 @@ async def test_get_one() -> None:
     """Test that the repository get_one returns a model record correctly."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -438,7 +438,7 @@ async def test_get_one_or_none() -> None:
     """Test that the repository get_one_or_none returns a model record correctly."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -456,7 +456,7 @@ async def test_get_or_create() -> None:
     """Test that the repository get_or_create returns a model record correctly."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -478,7 +478,7 @@ async def test_get_or_create_match_fields() -> None:
     """Test that the repository get_or_create returns a model record correctly."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
diff --git a/tests/contrib/sqlalchemy/repository/test_generic_mock_sync_repository.py b/tests/contrib/sqlalchemy/repository/test_generic_mock_sync_repository.py
--- a/tests/contrib/sqlalchemy/repository/test_generic_mock_sync_repository.py
+++ b/tests/contrib/sqlalchemy/repository/test_generic_mock_sync_repository.py
@@ -18,7 +18,7 @@
 def fx_authors() -> list[UUIDAuthor]:
     """Collection of Author models."""
     return [
-        UUIDAuthor(id=uuid4(), name=name, dob=dob, created=datetime.min, updated=datetime.min)
+        UUIDAuthor(id=uuid4(), name=name, dob=dob, created_at=datetime.min, updated_at=datetime.min)
         for name, dob in [("Agatha Christie", date(1890, 9, 15)), ("Leo Tolstoy", date(1828, 9, 9))]
     ]
 
@@ -113,36 +113,36 @@ def test_generic_mock_repository_raises_repository_exception_if_named_attribute_
 
 
 async def test_sets_created_updated_on_add() -> None:
-    """Test that the repository updates the 'created' and 'updated' timestamps
+    """Test that the repository updates the 'created_at' and 'updated_at' timestamps
     if necessary."""
 
     class UUIDModel(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     uuid_instance = UUIDModel()
-    assert "created" not in vars(uuid_instance)
-    assert "updated" not in vars(uuid_instance)
+    assert "created_at" not in vars(uuid_instance)
+    assert "updated_at" not in vars(uuid_instance)
 
     uuid_instance = GenericSyncMockRepository[UUIDModel]().add(uuid_instance)
-    assert "created" in vars(uuid_instance)
-    assert "updated" in vars(uuid_instance)
+    assert "created_at" in vars(uuid_instance)
+    assert "updated_at" in vars(uuid_instance)
 
     bigint_instance = BigIntModel()
-    assert "created" not in vars(bigint_instance)
-    assert "updated" not in vars(bigint_instance)
+    assert "created_at" not in vars(bigint_instance)
+    assert "updated_at" not in vars(bigint_instance)
 
     bigint_instance = GenericSyncMockRepository[BigIntModel]().add(bigint_instance)  # type: ignore[type-var]
-    assert "created" in vars(bigint_instance)
-    assert "updated" in vars(bigint_instance)
+    assert "created_at" in vars(bigint_instance)
+    assert "updated_at" in vars(bigint_instance)
 
 
 async def test_sets_updated_on_update(author_repository: GenericSyncMockRepository[UUIDAuthor]) -> None:
@@ -150,9 +150,9 @@ async def test_sets_updated_on_update(author_repository: GenericSyncMockReposito
     necessary."""
 
     instance = list(author_repository.collection.values())[0]
-    original_updated = instance.updated
+    original_updated = instance.updated_at
     instance = author_repository.update(instance)
-    assert instance.updated > original_updated
+    assert instance.updated_at > original_updated
 
 
 async def test_does_not_set_created_updated() -> None:
@@ -160,51 +160,51 @@ async def test_does_not_set_created_updated() -> None:
     appropriate."""
 
     class UUIDModel(base.UUIDBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     uuid_instance = UUIDModel()
     uuid_repo = GenericSyncMockRepository[UUIDModel]()
-    assert "created" not in vars(uuid_instance)
-    assert "updated" not in vars(uuid_instance)
+    assert "created_at" not in vars(uuid_instance)
+    assert "updated_at" not in vars(uuid_instance)
     uuid_instance = uuid_repo.add(uuid_instance)
-    assert "created" not in vars(uuid_instance)
-    assert "updated" not in vars(uuid_instance)
+    assert "created_at" not in vars(uuid_instance)
+    assert "updated_at" not in vars(uuid_instance)
     uuid_instance = uuid_repo.update(uuid_instance)
-    assert "created" not in vars(uuid_instance)
-    assert "updated" not in vars(uuid_instance)
+    assert "created_at" not in vars(uuid_instance)
+    assert "updated_at" not in vars(uuid_instance)
 
     bigint_instance = BigIntModel()
     bigint_repo = GenericSyncMockRepository[BigIntModel]()  # type: ignore[type-var]
-    assert "created" not in vars(bigint_instance)
-    assert "updated" not in vars(bigint_instance)
+    assert "created_at" not in vars(bigint_instance)
+    assert "updated_at" not in vars(bigint_instance)
     bigint_instance = bigint_repo.add(bigint_instance)
-    assert "created" not in vars(bigint_instance)
-    assert "updated" not in vars(bigint_instance)
+    assert "created_at" not in vars(bigint_instance)
+    assert "updated_at" not in vars(bigint_instance)
     bigint_instance = bigint_repo.update(bigint_instance)
-    assert "created" not in vars(bigint_instance)
-    assert "updated" not in vars(bigint_instance)
+    assert "created_at" not in vars(bigint_instance)
+    assert "updated_at" not in vars(bigint_instance)
 
 
 async def test_add() -> None:
     """Test that the repository add method works correctly`."""
 
     class UUIDModel(base.UUIDBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -224,13 +224,13 @@ async def test_add_many() -> None:
     """Test that the repository add_many method works correctly`."""
 
     class UUIDModel(base.UUIDBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -249,7 +249,7 @@ async def test_update() -> None:
     """Test that the repository update method works correctly`."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -267,7 +267,7 @@ async def test_update_many() -> None:
     """Test that the repository add_many method works correctly`."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -287,7 +287,7 @@ async def test_upsert() -> None:
     """Test that the repository upsert method works correctly`."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -305,7 +305,7 @@ async def test_list() -> None:
     """Test that the repository list returns records."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -320,7 +320,7 @@ async def test_delete() -> None:
     """Test that the repository delete functionality."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -337,7 +337,7 @@ async def test_delete_many() -> None:
     """Test that the repository delete many functionality."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -354,7 +354,7 @@ async def test_list_and_count() -> None:
     """Test that the repository list_and_count returns records and the total record count."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -371,7 +371,7 @@ async def test_exists() -> None:
     """Test that the repository exists returns booleans."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -387,7 +387,7 @@ async def test_count() -> None:
     """Test that the repository count returns the total record count."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -403,7 +403,7 @@ async def test_get() -> None:
     """Test that the repository get returns a model record correctly."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -420,7 +420,7 @@ async def test_get_one() -> None:
     """Test that the repository get_one returns a model record correctly."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -438,7 +438,7 @@ async def test_get_one_or_none() -> None:
     """Test that the repository get_one_or_none returns a model record correctly."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -456,7 +456,7 @@ async def test_get_or_create() -> None:
     """Test that the repository get_or_create returns a model record correctly."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
@@ -478,7 +478,7 @@ async def test_get_or_create_match_fields() -> None:
     """Test that the repository get_or_create returns a model record correctly."""
 
     class Model(base.UUIDAuditBase):
-        """Inheriting from AuditBase gives the model 'created' and 'updated'
+        """Inheriting from AuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         random_column: Mapped[str]
diff --git a/tests/contrib/sqlalchemy/repository/test_sqlalchemy_async.py b/tests/contrib/sqlalchemy/repository/test_sqlalchemy_async.py
--- a/tests/contrib/sqlalchemy/repository/test_sqlalchemy_async.py
+++ b/tests/contrib/sqlalchemy/repository/test_sqlalchemy_async.py
@@ -43,19 +43,19 @@ async def test_sqlalchemy_tablename(monkeypatch: MonkeyPatch) -> None:
     """Test the snake case conversion for table names."""
 
     class BigModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class TESTModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntAuditBase):
-        """Inheriting from BigIntAuditBase gives the model 'created' and 'updated'
+        """Inheriting from BigIntAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -69,7 +69,7 @@ async def test_sqlalchemy_sentinel(monkeypatch: MonkeyPatch) -> None:
     """Test the sqlalchemy sentinel column only exists on `UUIDPrimaryKey` models."""
 
     class AnotherModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         the_extra_col: Mapped[str] = mapped_column(String(length=100), nullable=True)  # pyright: ignore
@@ -95,8 +95,8 @@ class TheBigIntModel(base.BigIntBase):
     monkeypatch.setattr(model1, "_sa_instance_state", sa_instance_mock)
     monkeypatch.setattr(model2, "_sa_instance_state", sa_instance_mock)
     monkeypatch.setattr(model3, "_sa_instance_state", sa_instance_mock)
-    assert "created" not in model1.to_dict(exclude={"created"}).keys()
-    assert "the_extra_col" not in model1.to_dict(exclude={"created"}).keys()
+    assert "created_at" not in model1.to_dict(exclude={"created_at"}).keys()
+    assert "the_extra_col" not in model1.to_dict(exclude={"created_at"}).keys()
     assert "_sentinel" not in model1.to_dict().keys()
     assert "_sentinel" not in model2.to_dict().keys()
     assert "_sentinel" not in model3.to_dict().keys()
@@ -131,13 +131,13 @@ async def test_sqlalchemy_repo_add_many(mock_repo: SQLAlchemyAsyncRepository, mo
     """Test expected method calls for add many operation."""
 
     class UUIDModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntAuditBase):
-        """Inheriting from BigIntAuditBase gives the model 'created' and 'updated'
+        """Inheriting from BigIntAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -159,13 +159,13 @@ async def test_sqlalchemy_repo_update_many(mock_repo: SQLAlchemyAsyncRepository,
     """Test expected method calls for update many operation."""
 
     class UUIDModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntAuditBase):
-        """Inheriting from BigIntAuditBase gives the model 'created' and 'updated'
+        """Inheriting from BigIntAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -202,13 +202,13 @@ async def test_sqlalchemy_repo_delete_many(mock_repo: SQLAlchemyAsyncRepository,
     """Test expected method calls for delete operation."""
 
     class UUIDModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntAuditBase):
-        """Inheriting from BigIntAuditBase gives the model 'created' and 'updated'
+        """Inheriting from BigIntAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -424,7 +424,7 @@ async def test_sqlalchemy_repo_list_with_before_after_filter(
     mock_repo: SQLAlchemyAsyncRepository, monkeypatch: MonkeyPatch
 ) -> None:
     """Test list operation with BeforeAfter filter."""
-    field_name = "updated"
+    field_name = "updated_at"
     # model has to support comparison with the datetimes
     getattr(mock_repo.model_type, field_name).__lt__ = lambda self, compare: "lt"
     getattr(mock_repo.model_type, field_name).__gt__ = lambda self, compare: "gt"
@@ -515,12 +515,12 @@ def test_filter_in_collection_noop_if_collection_empty(mock_repo: SQLAlchemyAsyn
         (datetime.max, None),
     ],
 )
-def test__filter_on_datetime_field(before: datetime, after: datetime, mock_repo: SQLAlchemyAsyncRepository) -> None:
+def test_filter_on_datetime_field(before: datetime, after: datetime, mock_repo: SQLAlchemyAsyncRepository) -> None:
     """Test through branches of _filter_on_datetime_field()"""
     field_mock = MagicMock()
     field_mock.__gt__ = field_mock.__lt__ = lambda self, other: True
-    mock_repo.model_type.updated = field_mock
-    mock_repo._filter_on_datetime_field("updated", before, after, statement=mock_repo.statement)
+    mock_repo.model_type.updated_at = field_mock
+    mock_repo._filter_on_datetime_field("updated_at", before, after, statement=mock_repo.statement)
 
 
 def test_filter_collection_by_kwargs(mock_repo: SQLAlchemyAsyncRepository) -> None:
diff --git a/tests/contrib/sqlalchemy/repository/test_sqlalchemy_sync.py b/tests/contrib/sqlalchemy/repository/test_sqlalchemy_sync.py
--- a/tests/contrib/sqlalchemy/repository/test_sqlalchemy_sync.py
+++ b/tests/contrib/sqlalchemy/repository/test_sqlalchemy_sync.py
@@ -43,19 +43,19 @@ def test_sqlalchemy_tablename(monkeypatch: MonkeyPatch) -> None:
     """Test the snake case conversion for table names."""
 
     class BigModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class TESTModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntAuditBase):
-        """Inheriting from BigIntAuditBase gives the model 'created' and 'updated'
+        """Inheriting from BigIntAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -69,7 +69,7 @@ def test_sqlalchemy_sentinel(monkeypatch: MonkeyPatch) -> None:
     """Test the sqlalchemy sentinel column only exists on `UUIDPrimaryKey` models."""
 
     class AnotherModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         the_extra_col: Mapped[str] = mapped_column(String(length=100), nullable=True)  # pyright: ignore
@@ -130,13 +130,13 @@ def test_sqlalchemy_repo_add_many(mock_repo: SQLAlchemySyncRepository, monkeypat
     """Test expected method calls for add many operation."""
 
     class UUIDModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntAuditBase):
-        """Inheriting from BigIntAuditBase gives the model 'created' and 'updated'
+        """Inheriting from BigIntAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -158,13 +158,13 @@ def test_sqlalchemy_repo_update_many(mock_repo: SQLAlchemySyncRepository, monkey
     """Test expected method calls for update many operation."""
 
     class UUIDModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntAuditBase):
-        """Inheriting from BigIntAuditBase gives the model 'created' and 'updated'
+        """Inheriting from BigIntAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -201,13 +201,13 @@ def test_sqlalchemy_repo_delete_many(mock_repo: SQLAlchemySyncRepository, monkey
     """Test expected method calls for delete operation."""
 
     class UUIDModel(base.UUIDAuditBase):
-        """Inheriting from UUIDAuditBase gives the model 'created' and 'updated'
+        """Inheriting from UUIDAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
 
     class BigIntModel(base.BigIntAuditBase):
-        """Inheriting from BigIntAuditBase gives the model 'created' and 'updated'
+        """Inheriting from BigIntAuditBase gives the model 'created_at' and 'updated_at'
         columns."""
 
         ...
@@ -420,7 +420,7 @@ def test_sqlalchemy_repo_list_with_before_after_filter(
     mock_repo: SQLAlchemySyncRepository, monkeypatch: MonkeyPatch
 ) -> None:
     """Test list operation with BeforeAfter filter."""
-    field_name = "updated"
+    field_name = "updated_at"
     # model has to support comparison with the datetimes
     getattr(mock_repo.model_type, field_name).__lt__ = lambda self, compare: "lt"
     getattr(mock_repo.model_type, field_name).__gt__ = lambda self, compare: "gt"
@@ -511,12 +511,12 @@ def test_filter_in_collection_noop_if_collection_empty(mock_repo: SQLAlchemySync
         (datetime.max, None),
     ],
 )
-def test__filter_on_datetime_field(before: datetime, after: datetime, mock_repo: SQLAlchemySyncRepository) -> None:
+def test_filter_on_datetime_field(before: datetime, after: datetime, mock_repo: SQLAlchemySyncRepository) -> None:
     """Test through branches of _filter_on_datetime_field()"""
     field_mock = MagicMock()
     field_mock.__gt__ = field_mock.__lt__ = lambda self, other: True
-    mock_repo.model_type.updated = field_mock
-    mock_repo._filter_on_datetime_field("updated", before, after, statement=mock_repo.statement)
+    mock_repo.model_type.updated_at = field_mock
+    mock_repo._filter_on_datetime_field("updated_at", before, after, statement=mock_repo.statement)
 
 
 def test_filter_collection_by_kwargs(mock_repo: SQLAlchemySyncRepository) -> None:
diff --git a/tests/contrib/sqlalchemy/repository/test_uuid_async.py b/tests/contrib/sqlalchemy/repository/test_uuid_async.py
--- a/tests/contrib/sqlalchemy/repository/test_uuid_async.py
+++ b/tests/contrib/sqlalchemy/repository/test_uuid_async.py
@@ -2,7 +2,7 @@
 from __future__ import annotations
 
 import sys
-from datetime import datetime
+from datetime import datetime, timezone
 from typing import Any
 from uuid import UUID, uuid4
 
@@ -21,6 +21,7 @@
     BookAsyncRepository,
     RuleAsyncRepository,
     UUIDAuthor,
+    UUIDBook,
     UUIDRule,
 )
 
@@ -40,11 +41,19 @@ async def seed_db(
     # convert date/time strings to dt objects.
     for raw_author in raw_authors_uuid:
         raw_author["dob"] = datetime.strptime(raw_author["dob"], "%Y-%m-%d").date()
-        raw_author["created"] = datetime.strptime(raw_author["created"], "%Y-%m-%dT%H:%M:%S")
-        raw_author["updated"] = datetime.strptime(raw_author["updated"], "%Y-%m-%dT%H:%M:%S")
+        raw_author["created_at"] = datetime.strptime(raw_author["created_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
+        raw_author["updated_at"] = datetime.strptime(raw_author["updated_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
     for raw_author in raw_rules_uuid:
-        raw_author["created"] = datetime.strptime(raw_author["created"], "%Y-%m-%dT%H:%M:%S")
-        raw_author["updated"] = datetime.strptime(raw_author["updated"], "%Y-%m-%dT%H:%M:%S")
+        raw_author["created_at"] = datetime.strptime(raw_author["created_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
+        raw_author["updated_at"] = datetime.strptime(raw_author["updated_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
 
     async with async_engine.begin() as conn:
         await conn.run_sync(base.orm_registry.metadata.drop_all)
@@ -120,6 +129,22 @@ async def test_repo_list_and_count_method_empty(book_repo: BookAsyncRepository)
     assert len(collection) == 0
 
 
+async def test_repo_created_updated(author_repo: AuthorAsyncRepository) -> None:
+    """Test SQLALchemy created_at - updated_at.
+
+    Args:
+        author_repo (AuthorAsyncRepository): The author mock repository
+    """
+    author = await author_repo.get_one(name="Agatha Christie")
+    assert author.created_at is not None
+    assert author.updated_at is not None
+    original_update_dt = author.updated_at
+
+    author.books.append(UUIDBook(title="Testing"))
+    author = await author_repo.update(author)
+    assert author.updated_at == original_update_dt
+
+
 async def test_repo_list_method(
     raw_authors_uuid: list[dict[str, Any]],
     author_repo: AuthorAsyncRepository,
@@ -341,13 +366,17 @@ async def test_repo_filter_before_after(author_repo: AuthorAsyncRepository) -> N
         author_repo (AuthorAsyncRepository): The author mock repository
     """
     before_filter = BeforeAfter(
-        field_name="created", before=datetime.strptime("2023-05-01T00:00:00", "%Y-%m-%dT%H:%M:%S"), after=None
+        field_name="created_at",
+        before=datetime.strptime("2023-05-01T00:00:00", "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc),
+        after=None,
     )
     existing_obj = await author_repo.list(before_filter)
     assert existing_obj[0].name == "Leo Tolstoy"
 
     after_filter = BeforeAfter(
-        field_name="created", after=datetime.strptime("2023-03-01T00:00:00", "%Y-%m-%dT%H:%M:%S"), before=None
+        field_name="created_at",
+        after=datetime.strptime("2023-03-01T00:00:00", "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc),
+        before=None,
     )
     existing_obj = await author_repo.list(after_filter)
     assert existing_obj[0].name == "Agatha Christie"
@@ -381,9 +410,9 @@ async def test_repo_filter_order_by(author_repo: AuthorAsyncRepository) -> None:
         author_repo (AuthorAsyncRepository): The author mock repository
     """
 
-    existing_obj = await author_repo.list(OrderBy(field_name="created", sort_order="desc"))
+    existing_obj = await author_repo.list(OrderBy(field_name="created_at", sort_order="desc"))
     assert existing_obj[0].name == "Agatha Christie"
-    existing_obj = await author_repo.list(OrderBy(field_name="created", sort_order="asc"))
+    existing_obj = await author_repo.list(OrderBy(field_name="created_at", sort_order="asc"))
     assert existing_obj[0].name == "Leo Tolstoy"
 
 
diff --git a/tests/contrib/sqlalchemy/repository/test_uuid_sync.py b/tests/contrib/sqlalchemy/repository/test_uuid_sync.py
--- a/tests/contrib/sqlalchemy/repository/test_uuid_sync.py
+++ b/tests/contrib/sqlalchemy/repository/test_uuid_sync.py
@@ -2,7 +2,7 @@
 from __future__ import annotations
 
 import os
-from datetime import datetime
+from datetime import datetime, timezone
 from typing import Any, Generator, cast
 from uuid import UUID, uuid4
 
@@ -19,6 +19,7 @@
     BookSyncRepository,
     RuleSyncRepository,
     UUIDAuthor,
+    UUIDBook,
     UUIDRule,
 )
 
@@ -52,11 +53,19 @@ def _seed_db(
     # convert date/time strings to dt objects.
     for raw_author in raw_authors_uuid:
         raw_author["dob"] = datetime.strptime(raw_author["dob"], "%Y-%m-%d").date()
-        raw_author["created"] = datetime.strptime(raw_author["created"], "%Y-%m-%dT%H:%M:%S")
-        raw_author["updated"] = datetime.strptime(raw_author["updated"], "%Y-%m-%dT%H:%M:%S")
+        raw_author["created_at"] = datetime.strptime(raw_author["created_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
+        raw_author["updated_at"] = datetime.strptime(raw_author["updated_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
     for raw_author in raw_rules_uuid:
-        raw_author["created"] = datetime.strptime(raw_author["created"], "%Y-%m-%dT%H:%M:%S")
-        raw_author["updated"] = datetime.strptime(raw_author["updated"], "%Y-%m-%dT%H:%M:%S")
+        raw_author["created_at"] = datetime.strptime(raw_author["created_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
+        raw_author["updated_at"] = datetime.strptime(raw_author["updated_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
 
     with engine.begin() as conn:
         base.orm_registry.metadata.drop_all(conn)
@@ -77,11 +86,15 @@ def _seed_spanner(
 ) -> list[Table]:
     for raw_author in raw_authors_uuid:
         raw_author["dob"] = datetime.strptime(raw_author["dob"], "%Y-%m-%d").date()
-        raw_author["created"] = datetime.strptime(raw_author["created"], "%Y-%m-%dT%H:%M:%S")
-        raw_author["updated"] = datetime.strptime(raw_author["updated"], "%Y-%m-%dT%H:%M:%S")
+        raw_author["created_at"] = datetime.strptime(raw_author["created_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
+        raw_author["updated_at"] = datetime.strptime(raw_author["updated_at"], "%Y-%m-%dT%H:%M:%S").astimezone(
+            timezone.utc
+        )
     for raw_rule in raw_rules_uuid:
-        raw_rule["created"] = datetime.strptime(raw_rule["created"], "%Y-%m-%dT%H:%M:%S")
-        raw_rule["updated"] = datetime.strptime(raw_rule["updated"], "%Y-%m-%dT%H:%M:%S")
+        raw_rule["created_at"] = datetime.strptime(raw_rule["created_at"], "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc)
+        raw_rule["updated_at"] = datetime.strptime(raw_rule["updated_at"], "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc)
 
     with engine.begin() as txn:
         objs = []
@@ -199,6 +212,22 @@ def test_repo_list_and_count_method_empty(book_repo: BookSyncRepository) -> None
     assert len(collection) == 0
 
 
+def test_repo_created_updated(author_repo: AuthorSyncRepository) -> None:
+    """Test SQLALchemy created_at - updated_at.
+
+    Args:
+        author_repo (AuthorAsyncRepository): The author mock repository
+    """
+    author = author_repo.get_one(name="Agatha Christie")
+    assert author.created_at is not None
+    assert author.updated_at is not None
+    original_update_dt = author.updated_at
+
+    author.books.append(UUIDBook(title="Testing"))
+    author = author_repo.update(author)
+    assert author.updated_at == original_update_dt
+
+
 def test_repo_list_method(raw_authors_uuid: list[dict[str, Any]], author_repo: AuthorSyncRepository) -> None:
     """Test SQLALchemy list.
 
@@ -417,13 +446,17 @@ def test_repo_filter_before_after(author_repo: AuthorSyncRepository) -> None:
         author_repo (AuthorSyncRepository): The author mock repository
     """
     before_filter = BeforeAfter(
-        field_name="created", before=datetime.strptime("2023-05-01T00:00:00", "%Y-%m-%dT%H:%M:%S"), after=None
+        field_name="created_at",
+        before=datetime.strptime("2023-05-01T00:00:00", "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc),
+        after=None,
     )
     existing_obj = author_repo.list(before_filter)
     assert existing_obj[0].name == "Leo Tolstoy"
 
     after_filter = BeforeAfter(
-        field_name="created", after=datetime.strptime("2023-03-01T00:00:00", "%Y-%m-%dT%H:%M:%S"), before=None
+        field_name="created_at",
+        after=datetime.strptime("2023-03-01T00:00:00", "%Y-%m-%dT%H:%M:%S").astimezone(timezone.utc),
+        before=None,
     )
     existing_obj = author_repo.list(after_filter)
     assert existing_obj[0].name == "Agatha Christie"
@@ -457,9 +490,9 @@ def test_repo_filter_order_by(author_repo: AuthorSyncRepository) -> None:
         author_repo (AuthorSyncRepository): The author mock repository
     """
 
-    existing_obj = author_repo.list(OrderBy(field_name="created", sort_order="desc"))
+    existing_obj = author_repo.list(OrderBy(field_name="created_at", sort_order="desc"))
     assert existing_obj[0].name == "Agatha Christie"
-    existing_obj = author_repo.list(OrderBy(field_name="created", sort_order="asc"))
+    existing_obj = author_repo.list(OrderBy(field_name="created_at", sort_order="asc"))
     assert existing_obj[0].name == "Leo Tolstoy"