填充一系列枚举

时间:2018-01-12 02:50:45

标签: python postgresql sqlalchemy alembic

我无法通过我的简历迁移将枚举输入我的桌子。

MVCE:https://pastebin.com/ng3XcKLf

(SQLAlchemy 1.2,psycopg2 2.7.3.2和postgres 10.1 - 第15行需要使用postgres URI进行修改)

我阅读了有关SQLAlchemy / Postgres和Enums Arums的问题,但根据我在问题跟踪器中找到的内容,用1.1解决了这个问题。

有人能指出我正确的方向吗?

变体1: 尝试使用postgres枚举类型的属性

op.bulk_insert(permission, [{
    'name': 'ViewContent',
    'contexts': [pgpermissioncontexts.resourceType]
}])

这失败了:AttributeError: 'Enum' object has no attribute 'resourceType'

变体2: 尝试使用基础python枚举的属性

op.bulk_insert(permission, [{
    'name': 'ViewContent',
    'contexts': [PermissionContexts.resourceType]
}])

此操作因sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) cols of type permissioncontexts[] but expression is of type text[]

而失败

变体3: 将字符串数组转换为枚举数组

op.bulk_insert(permission, [{
    'name': 'ViewContent',
    'contexts': sa.cast([PermissionContexts.resourceType], sa.ARRAY(pgenum))
}])

这可能也可能不起作用 - python进程可以使用4GB的内存,然后一直存在直到终止。

变体4: 插入空数组

op.bulk_insert(permission, [{
    'name': 'ViewContent',
    'contexts': []
}])

这很有效,但显然没有价值。

1 个答案:

答案 0 :(得分:3)

不幸的是,枚举的数组不是开箱即用的,但是documented workaround, 这也在this answer中描述。使用ArrayOfEnum代替ARRAY,您的变体2可以使用:

op.bulk_insert(permission, [{
    'name': 'ViewContent',
    'contexts': [PermissionContexts.resourceType],
}])

投放到ARRAY(permissioncontexts)也应该有用,并且在不使用bulk_insert()时可以正常工作

op.execute(permission.insert().values({
    'name': 'ViewContent',
    'contexts': sa.cast([PermissionContexts.resourceType], ARRAY(pgpermissioncontexts)),
}))

或使用bulk_insert(multiinsert=False)时:

op.bulk_insert(permission, [{
    'name': 'ViewContent',
    'contexts': sa.cast([PermissionContexts.resourceType], ARRAY(pgpermissioncontexts)),
}], multiinsert=False)

似乎有一个错误,无论是alembic还是sqlalchemy处理多个游戏。