最初是在issue上以SQLAlchemy GitHub repository的形式出现的,但是似乎那里只有自动程序。
我有两个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
的{{1}}字典包含创建的域,并且在执行期间进入dialects/postgresql/base.py#L2677块。
我想念什么?如何注册映射域的自定义类型,以便反射API能够识别它们?
我正在使用_get_column_info
和PostgreSQL SQLAlchemy==1.2.14