Alembic:将列更改为 JSON 类型

meh*_*kek 5 python postgresql sqlalchemy alembic

我有初始迁移设置,但我想将列从 sqlalchemy.Text 更改为 sqlalchemy.JSON

我关注了这篇文章 https://amercader.net/blog/beware-of-json-fields-in-sqlalchemy/

column_foo = Column(mutable_json_type(dbtype=JSONB, nested=True), nullable=True)
Run Code Online (Sandbox Code Playgroud)

当我运行 alembic autogenerate 时,它​​无法识别任何更改,因此我手动编写了它:

import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import JSONB
...

def upgrade() -> None:
    op.alter_column("some_table", "column_foo", existing_type=JSONB(), nullable=True)


def downgrade() -> None:
    op.alter_column("some_table", "column_foo", existing_type=sa.TEXT(), nullable=True)

Run Code Online (Sandbox Code Playgroud)

注意:我还在我的 ORM 模块和 ALembic migriaon 脚本中尝试了常规 sqlalchemy.JSON。

#orm script
column_foo = Column(JSON, nullable=True)

#migration script
op.alter_column("some_table", "column_foo", existing_type=sa.JSON(), nullable=True)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,当我检查 postgres 数据库中的元数据时,我仍然看到 TEXT 类型:

CREATE TABLE public.some_table (
...
column_foo text NULL,
Run Code Online (Sandbox Code Playgroud)

为什么没有说 JSON 作为列类型?

meh*_*kek 5

找到了解决方案(postgresql_using):

op.alter_column("some_table", "column_foo", type_=sa.JSON(), nullable=True,postgresql_using='column_foo::json')
Run Code Online (Sandbox Code Playgroud)