填充枚举数组
Populating an array of enums
我无法从我的 alembic 迁移中将枚举添加到我的 table 中。
此处为 MVCE:https://pastebin.com/ng3XcKLf
(SQLAlchemy 1.2、psycopg2 2.7.3.2 和 postgres 10.1 - 第 15 行需要使用您的 postgres URI 进行修改)
我阅读了有关 SQLAlchemy/Postgres 和枚举数组的问题,但根据我在问题跟踪器中找到的内容,该问题已在 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': []
}])
这有效,但显然没有任何价值。
不幸的是,枚举数组不能开箱即用,但有一个 documented workaround,
中也有描述。使用 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 对多参数的处理存在错误。
我无法从我的 alembic 迁移中将枚举添加到我的 table 中。
此处为 MVCE:https://pastebin.com/ng3XcKLf
(SQLAlchemy 1.2、psycopg2 2.7.3.2 和 postgres 10.1 - 第 15 行需要使用您的 postgres URI 进行修改)
我阅读了有关 SQLAlchemy/Postgres 和枚举数组的问题,但根据我在问题跟踪器中找到的内容,该问题已在 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': []
}])
这有效,但显然没有任何价值。
不幸的是,枚举数组不能开箱即用,但有一个 documented workaround,
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 对多参数的处理存在错误。