听上去,您对按顺序列出的修订文件而不是按顺序排列的修订 ID 更感兴趣。前者可以在不改变修订 ID 的生成方式的情况下实现。
运行alembic init alembic 时生成的alembic.ini 文件有一个部分用于配置修订文件的命名:
# template used to generate migration files
# file_template = %%(rev)s_%%(slug)s
这是来自文档的解释:
file_template - 这是用于生成新文件的命名方案
迁移文件。存在的值是默认值,因此已注释
出去。可用的代币包括:
- %%(rev)s - 修订 ID
- %%(slug)s - 从修订消息派生的截断字符串
- %%(年)d, %%(月).2d, %%(日).2d, %%(小时).2d, %%(分钟).2d, %%(秒).2d -创建日期的组成部分,默认为 datetime.datetime.now(),除非还使用了时区配置选项。
因此将file_template = %%(year)d-%%(month).2d-%%(day).2d_%%(rev)s_%%(slug)s 添加到alembic.ini 会将您的修订命名为2018-11-15_xxxxxxxxxxxx_adding_a_column.py。
我发现了这个问题:https://bitbucket.org/zzzeek/alembic/issues/371/add-unixtime-stamp-to-start-of-versions,它为我指明了正确的方向。
A comment from from that issue:
时间戳不一定告诉您哪个文件是最新的,
因为允许分支。 “alembic history”是最好的
这方面的真相来源。
因此,文件命名解决方案不能保证迁移在目录中按逻辑排序(但会帮助 IMO)。可以提出相同的论点来反对使用顺序 ID。
如果您确实想指定自己的修订标识符,请在命令行上使用 --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 identifiers, used by Alembic.
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:]
对rev_id() 的函数调用在alembic 源中是硬编码的,因此如果没有对函数进行猴子修补,将很难覆盖该行为。您可以创建库的一个分支并重新定义该函数或使其调用的用于生成 id 的函数可配置。