Flask-Migrate 迁移是否可以跨不同的数据库引擎工作?

Will Flask-Migrate migrations work across different database engines?

我正在编写一个使用 Flask-SQLAlchemy 和 Flask-Migrate 的 Flask 应用程序。生产有一个 PostgreSQL 数据库,但对于开发,我希望使用 SQLite 而不是必须在我的开发机器上安装完整的 PostgreSQL。

我按照 in its docs 所述设置了 Flask-Migrate。我不禁注意到,当我在开发箱上 运行 flask db migrate 时,这些是写入控制台的前两行:

INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.

我的问题:这是否意味着生成的迁移脚本只适用于SQLite?

我预计不会,因为您应该将脚本提交给版本控制(在您对其进行手动检查之后)并将其用于生产中的迁移。 Flask-Migrate 的作者自己也承认 SQLAlchemy 的好处之一是您可以在开发和生产中使用不同的数据库引擎(参见 his blog post)。但是,为什么它要告诉我这些假设呢?有没有办法告诉它不要假设特定的数据库引擎?

Alembic 打印的 Context impl SQLiteImpl 消息实际上是应用程序中配置的数据库 URL 的结果。这个 URL 被送入 Alembic,它会为您选择的数据库分配合适的驱动程序。在您的生产环境中,您将看到 Context impl PostgresqlImpl

在开发和生产中使用不同的数据库是可以的,但是您必须小心使迁移的内容足够通用以适用于两者。显然,您将无法使用 Postgres 或 SQLite 的特定功能。我还建议添加一个也基于 Postgres 的临时服务器,您可以在 运行 生产之前测试您的迁移。