Почему столбцы mapped_column создаются в приоритете?

Рейтинг: 0Ответов: 1Опубликовано: 11.06.2023

Столкнулся с непонятной ситуацией, при создании таблицы(SQLAlchemy), один из столбцов дат почему то создается не в том порядке, в котором я указываю. Почему это происходит и как этом можно исправить? Пробовал переставлять в разном порядке, столбцы дат всегда создаются в одинаковом порядке.

Так выглядит мой объект:

class WbIncomes(Base):

    __tablename__ = 'incomes'
    __table_args__ = {'schema': 'wildberries'}

    income_id: Mapped[int] = mapped_column(primary_key=True)
    id: Mapped[int] = mapped_column(primary_key=True)
    date = mapped_column(Date)
    last_change_date: Mapped[datetime]
    article: Mapped[str]
    quantity: Mapped[int]
    date_close = mapped_column(Date)
    warehouse_name: Mapped[str]
    status: Mapped[str]

А вот, что я вижу в выводе:

> CREATE TABLE wildberries.incomes (
>         income_id INTEGER NOT NULL,
>         id INTEGER NOT NULL,
>         date DATE,
>         date_close DATE,
>         last_change_date TIMESTAMP WITHOUT TIME ZONE NOT NULL,
>         article VARCHAR NOT NULL,
>         quantity INTEGER NOT NULL,
>         warehouse_name VARCHAR NOT NULL,
>         status VARCHAR NOT NULL,
>         PRIMARY KEY (income_id, id) )

Ответы

▲ 0Принят

Проблема оказалось в том, что SQLAlchemy 2.0 ставит mapped_column(**kwargs) в приоритет и создает эти колонки в начале таблицы. Цитата из документации:

The mapped_column() construct is also reconciled with an explicitly passed mapped_column() construct, whose arguments will take precedence over those of the Annotated construct..

Поэтому наилучшим решением для меня оказалось указать все колонки как mapped_column() вместо простой типизации.