填充一系列枚举

And*_*ows 5 python postgresql sqlalchemy alembic

我从困难的迁移中将enum放入我的桌面时遇到了麻烦.

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]
}])
Run Code Online (Sandbox Code Playgroud)

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

变体2: 尝试使用底层python Enum的属性

op.bulk_insert(permission, [{
    'name': 'ViewContent',
    'contexts': [PermissionContexts.resourceType]
}])
Run Code Online (Sandbox Code Playgroud)

这失败了 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))
}])
Run Code Online (Sandbox Code Playgroud)

这可能会也可能不会起作用 - python进程可以使用4GB的内存,然后坐在那里直到终止.

变体4: 插入空数组

op.bulk_insert(permission, [{
    'name': 'ViewContent',
    'contexts': []
}])
Run Code Online (Sandbox Code Playgroud)

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

小智 3

不幸的是,枚举数组不能开箱即用,但有一个记录在案的解决方法该答案也对此进行了描述。使用ArrayOfEnum代替ARRAY,你的变体 2 有效:

op.bulk_insert(permission, [{
    'name': 'ViewContent',
    'contexts': [PermissionContexts.resourceType],
}])
Run Code Online (Sandbox Code Playgroud)

投射到ARRAY(permissioncontexts)也应该有效,并且在不使用时也有效bulk_insert()

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

或使用时bulk_insert(multiinsert=False)

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

alembic 或 sqlalchemy 对多参数的处理似乎存在错误。