听起来,您更感兴趣的是按顺序列出修订文件,而不是按顺序列出修订ID。前者可以在不改变修订ID生成方式的情况下实现。
运行alembic init alembic
时生成的alembic.ini
文件有一个配置修订文件命名的部分:
以下是来自文档的解释:
file_template - 这是用于生成新迁移文件的命名方案。当前值为默认值,已经被注释掉了。可用的记号包括:
- %%(rev)s - 迁移标识符
- %%(slug)s - 根据迁移消息生成的截断字符串
- %%(year)d, %%(month).2d, %%(day).2d, %%(hour).2d, %%(minute).2d, %%(second).2d - 创建日期的组成部分,默认情况下为 datetime.datetime.now() ,除非还使用了时区配置选项。
因此,在 alembic.ini
中添加 file_template = %%(year)d-%%(month).2d-%%(day).2d_%%(rev)s_%%(slug)s
将会把你的迁移命名为 2018-11-15_xxxxxxxxxxxx_adding_a_column.py
。
我在这个问题中找到了答案,它让我找到了正确的方向。
该问题的一个评论如下:
时间戳并不能保证告诉你哪个文件是最“新”的,因为允许分支。"alembic history" 应该是这方面的最佳信息源。
因此,文件命名方案不能保证迁移在目录中按逻辑顺序排序(但我认为会有所帮助)。同样的论点也可以用来反对使用连续标识符。
如果您确实想指定自己的迁移标识符,请在命令行上使用 --rev-id
标志。
例如:
alembic revision -m 'a message' --rev-id=1
将生成一个名为 1_a_message.py
的文件:
"""a message
Revision ID: 1
Revises:
Create Date: 2018-11-15 13:40:31.228888
"""
from alembic import op
import sqlalchemy as sa
revision = '1'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
pass
def downgrade():
pass
你可以自己管理修订标识符。编写一个简单的bash脚本来触发修订生成将非常容易,自动传递基于日期时间的rev_id
参数,例如 --rev-id=<current datetime>
,以控制目录中列出的顺序。
如果未指定修订ID,则会调用位于alembic.util.langhelpers
的rev_id()
函数:
def rev_id():
return uuid.uuid4().hex[-12:]
在alembic源代码中,对rev_id()
函数的调用是硬编码的,因此除非进行函数猴子补丁,否则很难覆盖其行为。您可以创建库的分支并重新定义该函数,或使它调用id生成的函数可配置。
alembic history -i
将无法找到头而崩溃。在日期前加上前缀可以更容易地定位罪犯。内置的时间戳方式仍然是梦想,因为它实际上是进入 alembic_version 的内容。我们开始使用--rev-id $(date -u +"%Y%m%dT%H%M%SZ")
与alembic revision
。 - John Christopher Jones%%(epoch)s
添加到file_template
标记列表中。 - odigity