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

Python 使用alembic创建db表和在SQLAlchemy中定义模型有什么区别?,python,flask,sqlalchemy,alembic,Python,Flask,Sqlalchemy,Alembic,我可以使用命令alembic revision-m'table\u name'创建表,然后使用alembic升级头定义版本并进行迁移 此外,我还可以通过在models.py(SQLAlchemy)中定义一个类在数据库中创建表 这两者的区别是什么?我很困惑。我把这个概念搞砸了吗 另外,当我使用Alembic迁移数据库时,为什么它不在我的models.py中形成一个新类?我知道已经创建了这些表,因为我使用SQLite浏览器检查了它们 我已经完成了所有的配置。Alembic数据库的目标和config.

我可以使用命令
alembic revision-m'table\u name'
创建表,然后使用
alembic升级头定义版本并进行迁移

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

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

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


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

是的,您的想法是错误的

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

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

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

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

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

  • 现在考虑你有开发和生产数据库,这意味着这项工作需要完成两次。还要考虑一下,当您的应用程序有几个版本,每个版本都有不同的数据库模式,并且您需要调查其中一个较旧版本中的错误时,这将是多么乏味,为此您需要重新创建该版本中的数据库

    看看没有迁移网络时会出现什么问题

    使用Alembic,您在开始时会有一点额外的工作,但这是值得的,因为它简化了升级的工作流程。创建阶段如下所示:

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

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

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

    makemigrations (which creates migrations files) 
    migrate (which translates migrations into sql and executes them on database)
    
    我发现在电池包括框架(Django)和其他框架(如Flask/Falcon)之间切换对某些人的理解是非常好的


    因此,使用alembic迁移非常方便,并且易于跟踪数据库更改。

    非常感谢。这对我来说已经很清楚了。不过我还有一些问题要问。通过手动迁移,您的意思是,在我向模型添加新类或修改模型中的现有类之后,我需要使用“alembic revision-m'tablename'”在alembic中进行新迁移。然后在versions文件夹中,我必须编辑(定义)新创建的.py文件以匹配我刚刚定义的模型类?手动操作是一种好的做法吗?是的。手动迁移需要您自己编写
    升级
    降级
    功能,无需Alembic的帮助。自动迁移生成相当不错,所以我更喜欢自动生成一个脚本,然后检查它并在必要时进行任何更正,显然是在我运行
    升级之前
    @Miguel感谢您的总结。这有助于我更好地理解总体开发流程。正如您所指出的,升级的好处之一是它保留了数据,但当我运行降级然后升级到反向时会发生什么情况,这将破坏dat