【问题标题】:SQLAlchemy: How to add column to existing table?SQLAlchemy:如何将列添加到现有表?
【发布时间】:2019-08-11 18:22:07
【问题描述】:

我正在尝试使用 SQLAchemy 向现有表中添加字段或列。

下面是表格类

class ReleaseVersion(Base):

    __tablename__ = 'versions'

    id = Column(Integer, primary_key=True, autoincrement=True)
    release = Column(String(128), nullable=False, unique=True)


    def __init__(self,release, id=None):

        if(id):
            self.id = id

        self.release = release

我使用以下行初始化表

myDB.ReleaseVersion.__table__.create(bind=self.engine, checkfirst=True)

在使用数据库一段时间后,我需要添加一个布尔字段“is_currentversion”,同时保留表的所有现有内容,但我不太确定如何执行此操作。

我应该手动为表创建字段并更新类吗? 或者,在表类中添加字段,如果在初始化函数中不存在,则添加列?

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    TL;DR

    使用piprequirements.txt 安装flask-migrate,然后在模型中添加新列后:

    flask db init
    flask db migrate -m "Adding column x."
    flask db upgrade
    

    Flask-迁移

    您要查找的内容称为数据库迁移。使用 Flask-Migrate 之类的东西可以让您更改数据库架构 - 添加或删除列 - 而不会丢失数据。它还对这些数据库迁移进行版本控制,以便您可以在必要时恢复。

    Flask-Migrate 使用 Alembic 模块,因此它们都具有相同的功能,Flask-Migrate 用于在您的 Flask 和 SQL-Alchemy 应用程序中正确设置 alembic。

    如果您的应用处于预生产阶段:

    这是Pretty Printed 的精彩视频,用于设置 Flask-Migrate。请注意,Flask-Migrate 适用于使用 SQL-Alchemy 作为 ORM 的 Flask 应用程序。

    如果您的应用处于后期制作阶段:

    你有两个选择。

    1. 如果您只想跟踪未来的数据库迁移(更简单的选项)

    运行flask db init,创建迁移存储库。 将新列添加到您的数据库模型中。

    运行flask db migrate,生成迁移。迁移脚本中只会包含新列。

    运行 flask db upgrade 将新迁移应用到您的数据库。

    此时您的数据库应该有新列,您可以继续工作。每当您需要进行其他更改时,请重复上述步骤。

    请注意,使用这种方法,您无法从头开始重新创建整个数据库。您必须有一种方法将数据库初始化为您在第 1 天拥有的架构,然后您可以应用迁移历史来将其升级到您当前的架构。

    1. 如果您想跟踪整个迁移历史记录,包括将 Flask-Migrate 添加到应用程序当天的架构。

    flask db init 开始,创建迁移存储库。 接下来,您需要让 Flask-Migrate 认为您的数据库是空的。您可以通过重命名您的实际数据库并创建一个具有相同名称但其中没有表的新数据库来做到这一点。

    在该状态下,运行flask db migrate。这将生成一个包含数据库整个架构的迁移。 完成初始迁移后,将数据库恢复到正确状态。

    运行flask db stamp head 将数据库标记为已更新。 将新列添加到您的数据库模型中。

    再次运行flask db migrate,生成第二次迁移。迁移脚本中只会包含新列。

    运行 flask db upgrade 将新迁移应用到您的数据库。

    【讨论】:

    • 您好博学家,在看到您的回答之前,我尝试在表定义类中添加新列,并在初始化函数中编写代码来检查该字段是否存在于数据库中。如果不存在,则将该字段以默认值添加到数据库中的表中,以确保表定义类与数据库匹配。它工作正常。现在,我想知道为什么在这种情况下迁移会是更好的选择。我理解做事和以正确的方式做事是两件不同的事情。我真的很想学习。感谢您的帮助。
    • 在我看来,数据库迁移非常重要,有几个原因。首先,它们标准化了跨数据库(即您的开发数据库、您的生产数据库等)的更改,从而降低了出错的风险。其次,它提供了数据库的版本控制,因此如果您确实犯了错误(我们都这样做),您可以恢复。最后它可以自动化,以便您下次更新更容易。
    【解决方案2】:

    您可以简单地在模型中添加一列,然后运行以下命令。

    flask db migrate -m "Your Message."
    

    然后运行:

    flask db upgrade
    

    现在检查您的数据库。 也可以参考Here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 2014-06-14
      相关资源
      最近更新 更多