【问题标题】:How to update Heroku database with new columns while database is live?如何在数据库运行时使用新列更新 Heroku 数据库?
【发布时间】:2020-12-30 02:15:12
【问题描述】:

我目前有一个使用 Flask 的实时 Heroku psql 数据库,其中包含我需要的数据。但是,我还需要使用表中的新列来更新数据库。每当我更新表并将其推送到 Heroku 时,应用程序都会关闭,说原始数据不遵循新模式。那么用 Heroku 上托管的数据更新数据库结构的最佳方法是什么?

例如: models_original.py

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String, unique=True, nullable=False)

到 models_new.py

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String, unique=True, nullable=False)
    last_name = db.Column(db.String, unique=True, nullable=False)

【问题讨论】:

  • 您在使用数据库迁移吗?通常,您会部署新代码,然后运行迁移。
  • @Chris 不,我不是。添加数据库迁移是否为时已晚(还是为时已晚)?
  • 最好从一开始就使用它们,但您现在应该可以开始了。我认为Flask-Migrate 是 Fl​​ask 和 SQLAlchemy 最流行的迁移库。 (不过,这并不能完全解决您的问题。通过迁移,您将推送新代码,然后运行迁移。没有它们,您将推送新代码,然后以其他方式修改数据库。在这两种情况下代码和数据库将暂时不同步。迁移仍然是一个非常好的主意。)

标签: python heroku flask-sqlalchemy


【解决方案1】:

迁移

作为最佳实践方法,普遍接受的是使用库或其他解决方案来管理数据库迁移——添加、删除、重命名列、表、索引等。正如 Chris 在 cmets 中指出的那样,Flask-Migrate 是使用 Flask 和 SQLAlchemy 进行数据库迁移的流行解决方案。

更新列或表的迁移将作为部署过程的一部分发生,就在应用程序重新启动之前。必须小心“破坏性”迁移(删除、重命名列和表),因为零停机部署将在迁移时运行“先前版本”应用程序。该“以前的版本”应用程序将具有“以前的版本”SQLAlchemy 模型,此时,有额外的列或名称错误的列。正如您现在所看到的,这将导致错误。

更新表格的问题

至于您在更新表格和出现错误时遇到的问题,我怀疑您在问题描述中犯了错误,或者还有其他一些误解。你说:

每当我更新 并将其推送到 Heroku 时,应用程序都会关闭,说原始数据不遵循新架构。

如果您不使用迁移库并且手动更新 Postgres 中的表,则不必推送任何代码。

但是,您的代码示例表明您正在更新 SQLAlchemy model 定义,而不是 Postgres table 结构。如果您更新模型(例如添加一列)并且它与表结构不匹配,SQLAlchemy 将抛出错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-27
    • 2011-05-22
    • 2019-07-26
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    相关资源
    最近更新 更多