当前位置: 首页 > 知识库问答 >
问题:

如果未检测到任何更改,如何防止alembic修订--autogenerate生成修订文件?

艾和通
2023-03-14

我有一个项目,我在模型中使用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修订和升级?

共有2个答案

宗政兴发
2023-03-14

要回答这个问题,我们需要了解alembic是如何工作的。基本上,当您运行alembic revision时,它会创建一个修订,并保留修订ID和down\u revision,然后像队列一样排列它们。。。如果您检查数据库,您会在表中看到最新的修订id。每个版本都需要一个文件来处理迁移,因此如果没有相关文件,您就无法拥有一个版本。。。因为alembic如何在重建项目时从基础自动迁移到最新版本?这就像是拼图中缺失的一块。

长话短说,不,没有相关文件,你不可能有一个修订版。

附言:关于Django和其他框架,它们有一个非常强大的迁移脚本,所以它可以处理迁移。在这种情况下,框架的迁移器会检查您的模型文件,并看到没有任何更改,因此它不会创建任何修订!这就是为什么您看不到任何更改不在迁移文件夹中,也不在数据库的alembic_version表中。

微生博简
2023-03-14

接受的答案没有回答问题。正确的答案是:是的,您可以调用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

  • 我修改了avsc文件中字段的数据类型为: 最初它是字符串类型。 但是avro生成的java类即使在eclipse中构建项目后仍然具有String。

  • 我正在尝试用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