Изначально создавалось как проблема в 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