Skip to content

Commit d61c721

Browse files
обавлены миксины, базовые классы sqlalchemy. доработана зависимость contextified_transactional_session
1 parent dc70efa commit d61c721

File tree

6 files changed

+55
-10
lines changed

6 files changed

+55
-10
lines changed

fastapi_django/db/models/base.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,41 @@
1-
from typing import Self
1+
from typing import Self, Any
2+
from uuid import uuid4, UUID
23

3-
from sqlalchemy import MetaData
4+
from sqlalchemy import MetaData, BigInteger, SmallInteger
45
from sqlalchemy.ext.asyncio import AsyncAttrs
5-
from sqlalchemy.orm import DeclarativeBase
6+
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
67

78
metadata = MetaData()
89

910

1011
class Model(AsyncAttrs, DeclarativeBase):
1112
metadata = metadata
1213

13-
def update(self, **values) -> Self:
14+
def update(self, **values: Any) -> Self:
1415
for key, value in values.items():
1516
setattr(self, key, value)
1617
return self
18+
19+
20+
class UUIDv4Base(Model):
21+
__abstract__ = True
22+
23+
id: Mapped[UUID] = mapped_column(default=uuid4, primary_key=True)
24+
25+
26+
class IntBase(Model):
27+
__abstract__ = True
28+
29+
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
30+
31+
32+
class BigIntBase(Model):
33+
__abstract__ = True
34+
35+
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=False)
36+
37+
38+
class SmallIntBase(Model):
39+
__abstract__ = True
40+
41+
id: Mapped[int] = mapped_column(SmallInteger, primary_key=True, autoincrement=False)

fastapi_django/db/models/mixins.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from datetime import datetime
2+
3+
from sqlalchemy import DateTime, func
4+
from sqlalchemy.orm import declarative_mixin, Mapped, mapped_column
5+
6+
7+
@declarative_mixin
8+
class CreatedAtMixin:
9+
created_at: Mapped[datetime] = mapped_column(
10+
DateTime(timezone=True), default=func.now(), server_default=func.now()
11+
)
12+
13+
14+
@declarative_mixin
15+
class UpdatedAtMixin:
16+
updated_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), onupdate=func.now())

fastapi_django/db/repositories/base.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@ class BaseRepository(Generic[Model]):
1616
def __init__(self):
1717
if not self.model_cls:
1818
raise ImproperlyConfigured(f"Не задана модель в атрибуте `{self.__class__.__name__}.model_cls`")
19-
self._session = session_context_var.get()
20-
assert self._session is not None, "Сессия не определена. Используйте декоратор"
21-
print(self._session)
2219
self._flush = False
2320
self._commit = False
2421
print(f"Инициировали репозиторий {self.__class__.__name__}")
2522

23+
@property
24+
def _session(self):
25+
session = session_context_var.get()
26+
assert session is not None, "Сессия не определена. Используйте декоратор"
27+
return session
28+
2629
def _clone(self) -> Self:
2730
clone = self.__class__()
2831
clone._flush = self._flush

fastapi_django/db/sessions.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from contextlib import asynccontextmanager
22
from contextvars import ContextVar
3-
from typing import Any, AsyncGenerator
3+
from typing import Any
44

5-
from sqlalchemy.ext.asyncio import async_sessionmaker, AsyncSession
5+
from sqlalchemy.ext.asyncio import async_sessionmaker
66

77
from fastapi_django.db import engine
88

@@ -32,6 +32,7 @@ async def contextified_transactional_session(**kw: Any):
3232
token = session_context_var.set(session)
3333
try:
3434
yield session
35+
await session.flush()
3536
await transaction.commit()
3637
except Exception as e:
3738
await transaction.rollback()

fastapi_django/sqlalchemy/__init__.py

Whitespace-only changes.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ check_untyped_defs = true
1010

1111
[tool.poetry]
1212
name = "fastapi-django"
13-
version = "0.19.0"
13+
version = "0.20.5"
1414
description = ""
1515
authors = ["albertalexandrov <[email protected]>"]
1616
packages = [{include = "fastapi_django"}]

0 commit comments

Comments
 (0)