在没有 db.drop_all(), db.create_all() 的情况下对 Flask 应用程序进行更改

Making changes to flask app without db.drop_all(), db.create_all()

我有一个部署在 Google 的 App Engine 上的 Flask 应用程序。我注意到一个小错误,我想修复它,但我的数据库已经填充。

如何在不丢失所有数据的情况下更改此次要代码并将其推送/部署回我的应用程序? (这可能是一个基本问题,但我没有找到太多。所有在线教程都专注于创建应用程序和部署,而不是更新)

到目前为止,每当我重新部署时,我一直在删除并重新创建表,这主要是出于无知。这是我遵循的步骤

  1. 1).在我的应用程序中进行更改
  2. 提交并推送对 bitbucket 源代码的更改
  3. 在Google云SDK中:git拉
  4. Google 云 SDK:gcloud 应用部署

这些步骤导致数据库为空,因为我从本地计算机推送的目录有一个空数据库。这是我应该使用 git 合并的地方吗?

这是数据库 "migration" 还是 "git merge"?我不确定使用什么正确的术语来进一步研究这个问题。谢谢

您的问题有几个角度。我将尝试为您提供一些信息,但我要警告您,这对您的工作流程来说不是一个微不足道的更改,您必须更改一些内容。

首先,根据您对问题的措辞方式,我认为您将数据库连同代码一起提交给 git。如果我没看错,那么这就是你需要停止做的事情。数据库不是代码,因此不应提交给源代码管理。

您的应用程序的每次安装都应该有一个完全独立的数据库。比如你自己的机器上会有一个数据库来做开发。您的 gcloud 部署中还需要另一个数据库。如果您的应用程序有其他用途,您可能需要更多数据库。对于很多人来说,一个非常常见的第​​三个数据库是用于自动化测试的数据库,它也可以位于您的本地开发机器中,但与您用于日常开发的数据库不同。

要更改数据库架构,您将不再删除和重新创建表,这显然是您已经意识到需要改进的地方。进行这些更改的一个好方法是使用数据库迁移框架。这些工具允许您生成简短的脚本,以更集中的方式对数据库进行这些更改,而无需破坏和重新创建所有内容,因此,数据通常不会丢失。对于 Flask-SQLAlchemy,数据库迁移的最佳选择是 Flask-Migrate,它是围绕 Alembic 迁移框架的轻量级包装器。 (我在这里可能有偏见,因为我是 Flask-Migrate 扩展的作者!)。

Flask-Migrate 文档:https://flask-migrate.readthedocs.io/en/latest/