Sqlite 缺少 ALTER 支持,Alembic 迁移因此失败。解决方案?

Sqlite lack of ALTER support, Alembic migration failing because of this. Solutions?

我正在为朋友 zumba class 开发一个小型注册应用程序,使用 Flask、SQLAlchemy 和 Flask-migrate(alembic) 来处理数据库更新。我选择了 SQlite,因为该应用程序必须是自包含的,并且在没有互联网访问权限的笔记本电脑上本地运行,而且 SQLite 不需要安装服务或其他服务,这也是必须的。

处理缺少 ALTER table 支持的 SQLite 在最初的开发过程中不是问题,因为我简单地销毁了数据库,并在出现问题时重新创建了数据库。但是现在我的朋友实际上正在使用我遇到的问题。

根据功能请求,必须修改 table,我又一次遇到了可怕的“"No support for ALTER of constraints in SQLite dialect"。我预见到这个问题将来也可能会出现。

我该如何处理这个问题?在处理数据库方面,我几乎是一个新手。我读到一种处理方法是创建一个新的 table,创建新的约束并复制数据并重命名 table,但我不知道如何在 alembic 脚本中实现它.

您可以在初始迁移创建的 env.py 文件中设置变量 (render_as_batch=True)。

context.configure(
    connection=connection,
    target_metadata=target_metadata,
    render_as_batch=True
)

需要 alembic > 0.7.0

这可以生成批处理操作迁移,即使用约束创建新的 table,复制现有数据,并删除旧的 table。参见 http://alembic.zzzcomputing.com/en/latest/batch.html#batch-mode-with-autogenerate

如果您仍然遇到问题,请注意 - sqlite 仍然存在细微差别,例如http://alembic.zzzcomputing.com/en/latest/batch.html#dropping-unnamed-or-named-foreign-key-constraints