Перейти к содержанию

SQLAlchemy#

Рассмотрим варианты интеграции SQLAlchemy с textcase.

Автогенерация имени таблицы#

Обычно имя таблицы задаётся вручную:

base.py
1
2
3
4
5
from sqlalchemy.orm import DeclarativeBase


class User(DeclarativeBase):
    __tablename__ = "user"

Чтобы не дублировать __tablename__ в каждой модели, можно создать базовый класс:

textcase.py
from typing import Any

from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.orm import DeclarativeBase

from textcase import snake


class Base(DeclarativeBase):
    @declared_attr
    @classmethod
    def __tablename__(cls) -> Any:  # noqa: ANN401
        return snake(cls.__name__)


class User(Base): ...

Если вы имеете в проекте Pydantic, то можно обойтись без этой библиотеки и применить pydantic.alias_generators.to_snake. Эта функция работает похожим образом и также обрабатывает сокращения, но весит больше.

pydantic.py
from typing import Any

from pydantic.alias_generators import to_snake
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.orm import DeclarativeBase


class Base(DeclarativeBase):
    @declared_attr
    @classmethod
    def __tablename__(cls) -> Any:  # noqa: ANN401
        return to_snake(cls.__name__)


class User(Base): ...

Используйте этот вариант, если Pydantic уже присутствует в проекте и вам нужен только этот сценарий. В остальных случаях предпочтительнее textcase из-за меньшего размера.