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