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 作为列类型?
找到了解决方案(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)
| 归档时间: |
|
| 查看次数: |
1818 次 |
| 最近记录: |