Пишу тут свою мини-ORM в
курсе для демонстрации возможностей питона и того, что своя ORM — это не космически сложно (не обязательно космически сложно).
В процессе продумывания вариантов, понял, что сейчас можно вообще красиво делать и просто. Типы полей в БД — на type hints, детали (ограничения длины строк, первичные ключи) — через typing.Annotated.
Без метаклассов, без дескрипторов, без __init_subclass__ , без наследования моделей от какого-то базового класса модели.
from dataclasses import dataclass
from typing import Annotated, ClassVar
from orm import (
Identity,
MaxLength,
PrimaryKey,
)
@dataclass(kw_only=True)
class User:
user_id: Annotated[
int,
Identity(),
PrimaryKey(),
]
name: str
email: Annotated[str, MaxLength(255),]
age: int
country: Annotated[str | None, MaxLength(2),] = None
__table__: ClassVar[str] = "users"
и использование в духе:
users = (
db.query(User)
.filter(age__gte=18, country="RU")
.order_by("-age", "name")
.limit(10)
.all()
)
ляпотааа
реализация ~800 строк кода всего
мы там ещё и свой веб-фреймворк бахнем, как без этого:)
а ещё вчера на курс человек из Вьетнама залетел, получается, вышли на планетарный уровень 🚀