PostgreSQL域反映为sqltypes.NULLTYPE

时间:2018-11-27 17:09:24

标签: python postgresql sqlalchemy

最初是在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

0 个答案:

没有答案