SQLAlchemy:如何向现有表添加列?

8

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

以下是表类:

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”,同时保留表中所有现有内容,但我不确定如何操作。
我应该手动创建该字段并更新类吗? 或者,在初始化函数中添加表类中的字段并在不存在时添加列?
2个回答

16

简介

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

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

Flask-Migrate

你要找的是所谓的数据库迁移。使用像Flask-Migrate这样的东西可以允许你更改数据库模式——添加或删除列——而不会丢失数据。它还可以对这些数据库迁移进行版本控制,以便在必要时可以还原到先前的状态。

Flask-Migrate使用Alembic模块,因此它们拥有同样的功能。Flask-Migrate用于正确地将alembic与您的Flask和SQL-Alchemy应用程序设置连接起来。

如果你的应用程序处于预生产阶段:

这里有一个由Pretty Printed提供的非常好的视频,介绍如何设置Flask-Migrate。请注意,Flask-Migrate适用于使用SQL-Alchemy作为ORM的Flask应用程序。

如果您的应用程序已经发布:

你有两个选择。

  1. 如果你只想跟踪从现在开始的数据库迁移(较容易的选项)

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

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

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

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

请注意,在这种方法中,您不能从头开始重新创建整个数据库。您必须有一种方法将数据库初始化为Day 1的模式,然后可以将迁移历史记录应用于其以升级为当前模式。

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

首先使用flask db init创建迁移存储库。 接下来,您需要欺骗Flask-Migrate,让它认为您的数据库为空。您可以通过重命名实际的数据库,并创建一个没有表的同名新数据库来达到这个目的。

在这种状态下,运行flask db migrate。这将生成包含您数据库完整模式的迁移。

一旦您拥有了初始迁移,恢复您的数据库到正确的状态。

运行flask db stamp head以标记数据库已更新。 向数据库模型中添加新列。

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

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


1
嗨Polymath,在看到你的回答之前,我尝试在表定义类中添加新列,并在初始化函数中编写了代码来检查字段是否存在于数据库中。如果不存在,则会将该字段添加到数据库中的表中,并以默认值进行设置,以确保表定义类与数据库匹配。这个方法运行良好。现在我想知道,在这种情况下,为什么迁移会是更好的选择呢?我明白让事情工作和按正确方式完成事情是两回事。我真的想学习。谢谢你的帮助。 - Kay
1
在我看来,数据库迁移有几个非常重要的原因。首先,它可以标准化跨数据库的更改(例如您的开发数据库、生产数据库等),从而降低错误风险。其次,它提供了数据库版本控制,因此如果出现错误(我们都会犯错),您可以回滚到以前的版本。最后,它可以自动化处理,这样下次更新就更容易了。 - koopmac

2
您可以在您的模型中简单地添加一列,然后运行以下命令。
flask db migrate -m "Your Message."

然后运行:
flask db upgrade

现在请检查您的数据库。 此外,您可以参考这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接