如何在fastapi中管理sqlalchemy模型迁移

l.b*_*oya 7 python sqlalchemy alembic

我已使用fastapi来处理sqlachemy模型面临的问题

sqlachemy第一次创建模型,但是当我们更改模型时不会影响 postgres 数据库。克服这个问题。

  • 我已经使用alembic包来处理模型迁移,它可以用于添加新列和删除列,但不能用于更改列,例如重命名列名称、更改数据类型等。
  • 当我重命名列名称时,它的创建升级操作会删除现有列并使用新名称添加新列(数据丢失)

例如:将is_superuser重命名为is_admin

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column("user", sa.Column("is_admin", sa.Boolean(), nullable=True))
    op.drop_column("user", "is_superuser")
    # ### end Alembic commands ###

Run Code Online (Sandbox Code Playgroud)

看看删除is_superuser列 int 的重命名发生了什么

我知道棘手的解决方案是在迁移中自定义添加操作 op.alter_column('table_name','column_name',new_column_name='new column name')

如何在 fastapi 中使用 sqlalchemy 处理模型迁移,因为如果我在 alembic 迁移中犯了错误,那对我来说将是危险的。

有没有其他包或方法来处理sqlalchemy的迁移

anj*_*505 1

用例:将表中的列重命名is_superuseris_adminuser

1. 使用蒸馏器操作

对于上面的情况,我们可以像下面这样编写迁移。

def upgrade():
    op.alter_column('user', 'is_superuser', nullable=True, new_column_name='is_admin')
Run Code Online (Sandbox Code Playgroud)

现在,运行命令alembic upgrade head --sql以查看SQL将应用于数据库的实际内容。

ALTER TABLE user RENAME is_superuser TO is_admin;
Run Code Online (Sandbox Code Playgroud)

2.使用自定义SQL

def upgrade():
    op.execute('ALTER TABLE user RENAME is_superuser TO is_admin;')
Run Code Online (Sandbox Code Playgroud)

运行命令alembic upgrade head以在数据库上应用迁移。

参考: