如何在 Alembic 迁移(Postgres)中使用现有的 sqlalchemy Enum

Chr*_* W. 7 python sqlalchemy alembic

在过去的某个时候,我运行了一个 alembic 迁移,它创建了一个users像......

def upgrade():
    ...
    op.create_table(
        "users",
        sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
        ...
        sa.Column("type", sa.Enum("Foo", "Bar", "Baz", name="usertype"), nullable=False),
        ...
    )
    ...
Run Code Online (Sandbox Code Playgroud)

...它会自动创建以usertypevalues命名的枚举"Foo", "Bar", "Baz"

现在,我想制作一些其他表格,它也引用相同的枚举。例如,

def upgrade():
    ...
    op.create_table('foobar',
        sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
        ...
        sa.Column('user_type', sa.Enum(< ???????? >), nullable=False),
        ...
    )
Run Code Online (Sandbox Code Playgroud)

引用现有枚举的语法是什么?

我似乎无法在文档中找到答案:https : //docs.sqlalchemy.org/en/13/core/type_basics.html#sqlalchemy.types.Enum

Dea*_*ean 8

Postgres 有两个部分可以实现这一点。

  1. 指定 create_type=False
  2. 使用sqlalchemy.dialects.postgresql.Enum(不是sqlalchemy.Enum

例如:

from sqlalchemy.dialects import postgresql

sa.Column('type', postgresql.ENUM('a', 'b', name='my_enum', create_type=False))
Run Code Online (Sandbox Code Playgroud)

  • 我还没有尝试过,但我认为你可以省略枚举值:`postgresql.ENUM(name='my_enum', create_type=False)`。 (2认同)

kri*_*hna 5

您可能需要传递枚举对象而不是其名称作为字符串。

    entity = Column(
        postgresql.ENUM(
            SocialType,
            create_type=False,
            checkfirst=True,
            inherit_schema=True,
        )
    )
Run Code Online (Sandbox Code Playgroud)

checkfirst=True并且create_type=False不会被alembic检测到。所以需要手动添加。最后,蒸馏器迁移应该是这样的

sa.Column('entity', postgresql.ENUM('github', 'twitter', name='socialtype', schema='dashboard', inherit_schema=True, create_type=False, checkfirst=True), nullable=True),
Run Code Online (Sandbox Code Playgroud)


Ali*_*zai -3

找不到有关如何修复此错误的太多信息,但这是您需要执行的操作。

自动生成迁移后,只需将 create_type=False 添加到迁移文件中的枚举字段。

sa.Column('user_type', sa.Enum(< ???????? >, create_type=False), nullable=False),
Run Code Online (Sandbox Code Playgroud)