Домен PostgreSQL отражается как sqltypes.NULLTYPE - PullRequest
0 голосов
/ 27 ноября 2018

Изначально создавалось как проблема в SQLAlchemy GitHub репозитории , но похоже, что там активны только боты.

У меня есть два домена PostgreSQL: isoweekday это основано на INT и isoweekdays, который является списком предыдущих элементов.Оба домена добавляют некоторые проверки, такие как отсутствие дубликатов, пустой список, только значения из диапазона <1, 7> и т. Д.

CREATE DOMAIN isoweekday AS INT
CHECK(...);

CREATE DOMAIN isoweekdays AS isoweekday[]
CHECK(...);

Я создал пользовательские типы SQLAlchemy, например:

class ISOWeekDayDomain(types.UserDefinedType, types.Integer):
    def get_col_spec(self, **kwargs):
        return 'isoweekday'


class ISOWeekDaysDomain(types.UserDefinedType, ARRAY):
    def __init__(self, **kwargs):
        if 'item_type' not in kwargs:
            kwargs['item_type'] = ISOWeekDayDomain

        super(ISOWeekDaysDomain, self).__init__(**kwargs)

    def get_col_spec(self, **kwargs):
        return 'isoweekdays'

, а затем определил столбец:

Column(
    ISOWeekDaysDomain, nullable=False, server_default=text('ARRAY[1,2,3,4,5,6,7]')
)

Создание миграций с использованием Alembic прошло успешно, и он вывел следующий оператор:

op.add_column(
    u'config',
    sa.Column(
        'dow',
        ISOWeekDaysDomain(),
        server_default=sa.text(u'ARRAY[1, 2, 3, 4, 5, 6, 7]'),
        nullable=False,
    ),
)

После применения миграций к базе данных яполучая следующее предупреждение:

sqlalchemy/dialects/postgresql/base.py:2683: SAWarning: Did not recognize type 'isoweekday[]' of column 'dow'

Запуск alembic приводит к новой миграции базы данных, которая изменяет ранее добавленный столбец с sqltypes.NULLTYPE.

op.alter_column(u'tent_crawling_config', 'dow',
           existing_type=sa.NullType(),
           nullable=False,
           existing_server_default=sa.text(u'ARRAY[1, 2, 3, 4, 5, 6, 7]'))

Словарь domains, переданный _get_column_info содержит оба созданных домена и во время выполнения входит в блок dialects / postgresql / base.py # L2677 .

Чего мне не хватает?Как зарегистрировать мои пользовательские типы, которые отображают домены, чтобы API-интерфейс отражений распознавал их?

Я использую SQLAlchemy==1.2.14 и PostgreSQL v11

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...