使用alembic创建db表和在SQLAlchemy中定义模型有什么区别?

时间:2015-05-24 15:30:02

标签: python flask sqlalchemy alembic

我可以使用命令alembic revision -m 'table_name'创建表格,然后定义版本并使用alembic upgrade head进行迁移。

另外,我可以通过在models.py(SQLAlchemy)中定义一个类来在数据库中创建表。

两者有什么区别?我很困惑。我搞砸了这个概念吗?

另外,当我使用Alembic迁移数据库时,为什么它不会在我的models.py中形成新类?我知道这些表已经创建,因为我使用SQLite浏览器检查了它们。

我已经完成了所有配置。 Alembic数据库的目标和SQLALCHEMY_DATABASE-URI中的config.py.db个文件。

2 个答案:

答案 0 :(得分:17)

是的,你正在以错误的方式思考它。

我们假设您不使用Alembic或任何其他迁移框架。在这种情况下,您可以使用以下步骤为应用程序创建新数据库:

  1. 编写模型类
  2. 创建和配置全新数据库
  3. 运行db.create_all(),查看您的模型并在数据库中创建相应的表。
  4. 现在考虑升级的情况。例如,假设您发布了应用程序的1.0版本,现在开始使用2.0版,这需要对数据库进行一些更改。你怎么能实现这一目标?这里的限制是db.create_all()不修改表,它只能从头创建它们。所以它是这样的:

    1. 对模型类进行必要的更改
    2. 现在您有两种方法可以将这些更改传输到数据库:

      5.1销毁数据库,以便您可以再次运行db.create_all()以获取更新的表,也可以备份和恢复数据,以免丢失数据。不幸的是,SQLAlchemy对数据没有帮助,你必须使用数据库工具。

      5.2手动将更改直接应用于数据库。这很容易出错,如果更改集很大,则会很繁琐。

    3. 现在考虑您拥有开发和生产数据库,这意味着工作需要完成两次。还要考虑当你有几个版本的应用程序时会有多么乏味,每个版本都有不同的数据库模式,你需要调查一个旧版本中的错误,你需要重新创建数据库中的错误。释放。

      如果您没有迁移网络,请查看问题所在?

      使用Alembic,您在启动时会有一些额外的工作,但它会得到回报,因为它简化了升级的工作流程。创建阶段如下:

      1. 编写模型类
      2. 创建和配置全新数据库
      3. 手动或自动生成初始Alembic迁移。如果您使用自动迁移,Alembic会查看您的模型并生成将这些模型应用于数据库的代码。
      4. 运行运行迁移脚本的upgrade命令,有效地在数据库中创建表。
      5. 然后,当您达到升级的目的时,您将执行以下操作:

        1. 对模型类进行必要的更改
        2. 生成另一个Alembic迁移。如果你让Alembic为你生成这个,那么它会将你的模型类与数据库中的当前模式进行比较,并生成使数据库与模型匹配所需的代码。
        3. 运行upgrade命令。这会将更改应用于数据库,而无需销毁任何表或备份数据。您可以在所有数据库(生产,开发等)上运行此升级。
        4. 使用Alembic时需要考虑的重要事项:

          • 迁移脚本成为源代码的一部分,因此需要将它们与您自己的文件一起提交给源代码控制。
          • 如果您使用自动迁移生成,则始终必须查看生成的迁移。 Alembic并不总是能够确定确切的更改,因此生成的脚本可能需要进行一些手动微调。
          • 迁移脚本具有upgradedowngrade个功能。这意味着它们不仅可以简化升级,还可以降级。如果您需要将数据库同步到旧版本,downgrade命令可以为您完成,而无需您做任何额外的工作!

答案 1 :(得分:0)

我可以为Django添加两个命令

makemigrations (which creates migrations files) 
migrate (which translates migrations into sql and executes them on database)

我发现它非常适合有人理解在电池包括框架(Django)和其他框架(如Flask / Falcon)之间切换。

因此,使用alembic迁移非常方便,并且可以轻松跟踪数据库更改。