Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迁移是否可以跨不同的数据库引擎工作?_Python_Flask_Flask Sqlalchemy_Alembic_Flask Migrate - Fatal编程技术网

Python 迁移是否可以跨不同的数据库引擎工作?

Python 迁移是否可以跨不同的数据库引擎工作?,python,flask,flask-sqlalchemy,alembic,flask-migrate,Python,Flask,Flask Sqlalchemy,Alembic,Flask Migrate,我正在编写一个使用Flask SQLAlchemy和Flask Migrate的Flask应用程序。生产部门有一个PostgreSQL数据库,但对于开发,我希望使用SQLite,而不是在我的开发机器上安装完整的PostgreSQL 我按照描述设置了一个迁移。我不禁注意到,当我在dev框上运行flask db migrate时,这是写入控制台的前两行代码: INFO [alembic.runtime.migration] Context impl SQLiteImpl. INFO [alemb

我正在编写一个使用Flask SQLAlchemy和Flask Migrate的Flask应用程序。生产部门有一个PostgreSQL数据库,但对于开发,我希望使用SQLite,而不是在我的开发机器上安装完整的PostgreSQL

我按照描述设置了一个迁移。我不禁注意到,当我在dev框上运行
flask db migrate
时,这是写入控制台的前两行代码:

INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
我的问题:这是否意味着生成的迁移脚本只适用于SQLite


我本以为不会,因为您应该将脚本提交到版本控制(在您进行手动检查之后),并在生产中使用它进行迁移。《Flask迁移》一书的作者承认,SQLAlchemy的好处之一是您可以在开发和生产中使用不同的数据库引擎(请参阅)。但是,为什么它要告诉我这些假设呢?有没有办法告诉它不要使用特定的数据库引擎?

Alembic打印的
上下文impl SQLiteImpl
消息实际上是应用程序中配置的数据库URL的结果。这个URL被送入Alembic,Alembic为您选择的数据库分配适当的驱动程序。在您的生产环境中,您将看到
Context impl postgresqlinpl


在开发和生产中使用不同的数据库是可以的,但是您必须小心使迁移的内容具有足够的通用性,以便两者都可以使用。显然,您将无法使用Postgres或SQLite特定的功能。我还建议添加一个同样基于Postgres的登台服务器,在生产环境中运行迁移之前,您可以在那里测试迁移。

谢谢。我想尚不清楚的是,Postgres或SQLite的特定功能在脚本中起到了什么作用。例如,我有一个带有枚举列的表。SQLite没有枚举类型,但Alembic仍然在迁移脚本中生成了一个枚举列。所以这不是问题;在升级步骤之前,它不会转换为特定于引擎的类型。因此,如果像这样的引擎差异对Alembic来说无关紧要,那么哪一个才重要呢?我想我真正想知道的是:我应该将上下文消息解释为“我们正在尝试生成一个通用脚本,但是SQLite的一些工件可能会不可避免地出现”,还是说“我们正在优化SQLite的迁移脚本?”这只意味着迁移脚本将由Alembic中的SQLite驱动程序执行。正如我在回答中所说的,在使用不同的数据库时,最好不断测试您不会意外地生成一个在其中一个数据库中工作的迁移,而不是在另一个数据库中工作的迁移。在我看来,登台服务器是必须的。我当然计划接受你对登台服务器的建议。我担心在测试时会忽略一个问题,因为我还在学习SQLAlchemy。因此,了解迁移脚本是否能够以最小的“泛化”方式工作是很有帮助的,它更可能是我遗漏了什么,或者它实际上是正确的。无论如何,谢谢,这很有帮助。你可能太担心我说的话了,可能是因为我让人觉得做一些破坏数据库兼容性的事情太容易了。根据我的经验,只要您继续使用基本列类型,您可能会很好。但需要记住的一点是,SQLite不强制执行列大小,而其他数据库则强制执行。因此,如果您定义的列的大小对于您在其中编写的内容来说太短,那么在Postgres中运行代码之前,您不会注意到。