如何在数据库运行时用新列更新Heroku数据库



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

例如:型号_原始.py

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

至型号_新.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是使用Flask和SQLAlchemy进行数据库迁移的流行解决方案。

迁移,更新列或表,将作为部署过程的一部分,在应用程序重新启动之前进行。必须小心";破坏性的";迁移(删除、重命名列和表(,因为在零停机部署的情况下;以前的版本";迁移时正在运行的应用程序。";以前的版本";应用程序将具有";以前的版本";SQLAlchemy模型,在这一点上,有额外的列或名称错误的列。这将导致错误,正如您现在看到的那样。

您更新表的问题

至于你在更新表格和出错时遇到的问题,我怀疑你要么在描述问题时犯了错误,要么还有其他误解。你说:

每当我更新并将其推送到Heroku时,应用程序就会关闭,表示原始数据不遵循新模式。

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

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

最新更新