gpt4 book ai didi

python - 使用 alembic 创建数据库表和在 SQLAlchemy 中定义模型有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 22:02:16 41 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

是的,你想错了。

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

  1. 编写模型类
  2. 创建并配置一个全新的数据库
  3. 运行 db.create_all(),它会查看您的模型并在您的数据库中创建相应的表。

那么现在考虑升级的情况。例如,假设您发布了应用程序的 1.0 版,现在开始使用 2.0 版,这需要对您的数据库进行一些更改。你怎么能做到这一点?这里的限制是 db.create_all() 不修改表,它只能从头开始创建它们。所以它是这样的:

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

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

    5.2 手动将更改直接应用到数据库。这很容易出错,如果变更集很大,会很乏味。

现在考虑您有开发和生产数据库,这意味着工作需要完成两次。还想一想如果您有多个应用程序版本,每个版本都有不同的数据库模式,并且您需要调查其中一个较旧版本中的错误,您需要重新创建数据库,因为它是在那个版本中发布。

看看没有迁移网络的问题是什么?

使用 Alembic,您在开始时需要做一些额外的工作,但它会带来返回,因为它简化了升级的工作流程。创建阶段是这样的:

  1. 编写模型类
  2. 创建并配置一个全新的数据库
  3. 手动或自动生成初始 Alembic 迁移。如果您使用自动迁移,Alembic 会查看您的模型并生成将这些模型应用于数据库的代码。
  4. 运行 upgrade 命令,该命令运行迁移脚本,有效地在您的数据库中创建表。

然后,当您到达升级点时,执行以下操作:

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

使用 Alembic 时需要考虑的重要事项:

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

关于python - 使用 alembic 创建数据库表和在 SQLAlchemy 中定义模型有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425214/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com