我有一个项目,我在模型中使用SQLAlchemy,并尝试集成Alembic进行迁移。当我更改模型时,一切都按预期进行,Alembic看到模型已经更改-
但是当我没有改变模型中的任何东西并且我使用相同的命令时:
alembic修订版-自动生成-m"应该没有迁移"
修订版给我“空”修订版文件,如下所示:
"""next
Revision ID: d06d2a8fed5d
Revises: 4461d5328f57
Create Date: 2021-12-02 18:09:42.208607
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'd06d2a8fed5d'
down_revision = '4461d5328f57'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
这个文件的目的是什么?当alembic revision--autogenerate看不到任何更改时,我可以阻止创建这个“空文件”吗?要比较使用Django和键入命令时的内部迁移:
python管理。py makemigrations
我得到如下输出:
未检测到任何更改
并且没有创建迁移文件。有没有办法对Alembic修订做同样的事情?或者有其他命令可以检查模型是否有变化,如果有,我可以简单地运行alembic修订和升级?
要回答这个问题,我们需要了解alembic是如何工作的。基本上,当您运行alembic revision时,它会创建一个修订,并保留修订ID和down\u revision,然后像队列一样排列它们。。。如果您检查数据库,您会在表中看到最新的修订id。每个版本都需要一个文件来处理迁移,因此如果没有相关文件,您就无法拥有一个版本。。。因为alembic如何在重建项目时从基础自动迁移到最新版本?这就像是拼图中缺失的一块。
长话短说,不,没有相关文件,你不可能有一个修订版。
附言:关于Django和其他框架,它们有一个非常强大的迁移脚本,所以它可以处理迁移。在这种情况下,框架的迁移器会检查您的模型文件,并看到没有任何更改,因此它不会创建任何修订!这就是为什么您看不到任何更改不在迁移文件夹中,也不在数据库的alembic_version
表中。
接受的答案没有回答问题。正确的答案是:是的,您可以调用alembic修订--autogen
并确保只有在发生更改时才会生成修订文件:
根据Alembic的留档
在Flask-Migrate中实现(正是在这个文件中),它只是对env.py的更改以考虑所需的功能,即如果模型没有更改,则不自动生成修订。
您仍然会运行alembic修订版--autogen-m"应该没有迁移"
,但您将对env.py进行的更改是,简而言之:
def run_migrations_online():
# almost identical to Flask-Migrate (Thanks miguel!)
# this callback is used to prevent an auto-migration from being generated
# when there are no changes to the schema
def process_revision_directives(context, revision, directives):
if config.cmd_opts.autogenerate:
script = directives[0]
if script.upgrade_ops.is_empty():
directives[:] = []
print('No changes in schema detected.')
connectable = engine_from_config(
config.get_section(config.config_ini_section),
prefix="sqlalchemy.",
poolclass=pool.NullPool,
)
with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
process_revision_directives=process_revision_directives
)
with context.begin_transaction():
context.run_migrations()
现在,您可以轻松调用alembic修订版--autogen
,而不会冒创建新空修订版的风险。
问题内容: 我很难让Alembic使用(Flask-SQLAlchemy)而不是自动生成从更改到类的候选迁移。 我已经进行了修改,以创建我的Flask应用,导入所有相关模型,初始化数据库,然后运行迁移: 这种方法适用于(例如,当重新创建用于单元测试的测试数据库时),但是在这种情况下,它似乎无法实现。自动生成的版本脚本始终具有空的升级和降级方法,例如, 我的更改包括重命名列,更改列定义等,而不仅仅是
我正在尝试将svn修订号添加到清单文件中。我的根pom里有这个。xml: 我试图在我的耳朵里加入svn修订版pom.xml: 我没有得到任何版本的MANIFEST文件。知道我做错了什么吗?
我已经将WooCommerce应用到我的网店,并连接了一个CorvusPay网关进行在线支付。 现在我们遇到的问题是,Corvus要求我的订单号包含字符(大写和小写)以及数字。 我在Wordpress中看到并尝试了许多插件和过滤器,了解如何更改我的订单号,但在订单处理并发送到Corvus的过程中,订单号仍然是原来的post ID。 我知道WooCommerce使用Wordpress帖子ID来创建初
软件版本:alembic 1.0.5、SQLAlchemy 1.2.14、MySQL 5.7、Python 3.6.7 我试图使用alembic来保持MySQL数据库模式和Python ORM表示的一致性。 我看到的问题是,迁移总是有多余的外键删除和创建命令。autogenerate似乎认为有些东西是不同的,但实际上它们是相同的。 在重复调用命令时: ...将生成相同的拖放和创建命令。 stdou
我正在尝试用React-Native构建我的第一个应用程序。 我正在遵循这两个教程: https://facebook.github.io/react-native/docs/gett-started.html#content https://facebook.github.io/react-native/docs/android-setup.html 我尝试安装Android build too
我修改了avsc文件中字段的数据类型为: 最初它是字符串类型。 但是avro生成的java类即使在eclipse中构建项目后仍然具有String。