我可以使用命令alembic revision -m 'table_name'
创建表格,然后定义版本并使用alembic upgrade head
进行迁移。
另外,我可以通过在models.py
(SQLAlchemy)中定义一个类来在数据库中创建表。
两者有什么区别?我很困惑。我搞砸了这个概念吗?
另外,当我使用Alembic迁移数据库时,为什么它不会在我的models.py
中形成新类?我知道这些表已经创建,因为我使用SQLite浏览器检查了它们。
我已经完成了所有配置。 Alembic数据库的目标和SQLALCHEMY_DATABASE-URI
中的config.py
是.db
个文件。
答案 0 :(得分:17)
是的,你正在以错误的方式思考它。
我们假设您不使用Alembic或任何其他迁移框架。在这种情况下,您可以使用以下步骤为应用程序创建新数据库:
db.create_all()
,查看您的模型并在数据库中创建相应的表。现在考虑升级的情况。例如,假设您发布了应用程序的1.0版本,现在开始使用2.0版,这需要对数据库进行一些更改。你怎么能实现这一目标?这里的限制是db.create_all()
不修改表,它只能从头创建它们。所以它是这样的:
现在您有两种方法可以将这些更改传输到数据库:
5.1销毁数据库,以便您可以再次运行db.create_all()
以获取更新的表,也可以备份和恢复数据,以免丢失数据。不幸的是,SQLAlchemy对数据没有帮助,你必须使用数据库工具。
5.2手动将更改直接应用于数据库。这很容易出错,如果更改集很大,则会很繁琐。
现在考虑您拥有开发和生产数据库,这意味着工作需要完成两次。还要考虑当你有几个版本的应用程序时会有多么乏味,每个版本都有不同的数据库模式,你需要调查一个旧版本中的错误,你需要重新创建数据库中的错误。释放。
如果您没有迁移网络,请查看问题所在?
使用Alembic,您在启动时会有一些额外的工作,但它会得到回报,因为它简化了升级的工作流程。创建阶段如下:
upgrade
命令,有效地在数据库中创建表。然后,当您达到升级的目的时,您将执行以下操作:
upgrade
命令。这会将更改应用于数据库,而无需销毁任何表或备份数据。您可以在所有数据库(生产,开发等)上运行此升级。使用Alembic时需要考虑的重要事项:
upgrade
和downgrade
个功能。这意味着它们不仅可以简化升级,还可以降级。如果您需要将数据库同步到旧版本,downgrade
命令可以为您完成,而无需您做任何额外的工作!答案 1 :(得分:0)
我可以为Django添加两个命令
makemigrations (which creates migrations files)
migrate (which translates migrations into sql and executes them on database)
我发现它非常适合有人理解在电池包括框架(Django)和其他框架(如Flask / Falcon)之间切换。
因此,使用alembic迁移非常方便,并且可以轻松跟踪数据库更改。