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

cha*_*arn 6 python sqlalchemy flask alembic

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

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

两者有什么区别?我很困惑.我弄乱了这个概念吗?

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

我已经完成了所有配置.用于蒸馏器的数据库和目标SQLALCHEMY_DATABASE-URIconfig.py是相同的.db文件.

Mig*_*uel 22

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

假设您不使用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. 运行upgrade命令.这会将更改应用于数据库,而无需销毁任何表或备份数据.您可以在所有数据库(生产,开发等)上运行此升级.

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

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

  • 对.手动迁移需要您自己编写`upgrade`和`downgrade`函数,而不需要Alembic的帮助.自动迁移生成相当不错,所以我更喜欢自动生成脚本,然后在必要时查看它并进行任何更正,显然在我运行`upgrade`之前. (2认同)