alembic 是否关心其迁移文件的名称?

Does alembic care what its migration files are called?

我正在审查同事编写的一些代码,我注意到 Alembic 迁移文件中包含的迁移 ID 与文件名不匹配,例如文件 18b6422c9d3f_some_migration.py 包含

revision = 'c4218d61f026'

我的同事不知道这是怎么发生的,所有其他修订文件的名称似乎都与它们的修订 ID 一致。为了我自己的理智,我想重命名文件以匹配其修订 ID。

Alembic revision IDs don't hold any real semantic value 似乎很清楚,重命名文件似乎没有破坏任何东西。我仍然可以 运行 向前和向后迁移。但我对 Alembic 相当缺乏经验,我想确保这样做是安全的。

如果我 git mv 18b6422c9d3f_some_migration.py c4218d61f026_some_migration.py 会有任何长期问题吗?

只要将其中的 revision 变量设置为修订 ID,就可以重命名修订文件。

虽然修订 ID 确实被添加到新生成的修订文件的名称之前(其余部分来自描述迁移的注释),但 versions 目录中的所有 Python 个文件在集合修订 ID 和它们之间的链接时被考虑。

The tutorial 说:

Every time Alembic runs an operation against the versions/ directory, it reads all the files in, and composes a list based on how the down_revision identifiers link together, with the down_revision of None representing the first file.

查看代码(版本 0.8.5,alembic/script/base.pyScript._from_filename 方法)表明脚本是从任何可以确定修订 ID 的文件加载的,如果在脚本文件中设置了修订版 ID,使用时不考虑文件名。仅当未明确设置修订 ID 时,才期望从文件名的开头读取它。这个逻辑似乎从 0.2 版开始就存在了。

您问题的具体答案是 是的,您可以重命名您的迁移而不会出现长期问题。事实上,如果您因为对实际修订 ID 的混淆而不这样做,则更有可能遇到长期问题。

在文件名中包含修订 ID 的全部意义在于可以轻松找到包含特定修订的文件,错误标记的文件很容易在几个月后让您失望。

您可以将迁移文件的名称视为提交消息,而修订 ID 非常类似于提交哈希。我个人有时会重命名我的迁移文件以使名称更有用,因为自动生成的名称有时很难看或由于自动生成长度限制而遗漏消息的关键位。