有没有办法在Alembic中生成顺序修订ID?

问题描述 投票:0回答:1

我正在使用Alembic作为Python项目的数据库迁移工具。当我运行这样的命令时:

alembic revision -m "adding a column"

...它将添加一个名为alembic/versions/xxxxxxxxxxxx_adding_a_column.py的新文件,其中xxxxxxxxxxxx是一个随机生成的12位哈希值。

从使人类可读的角度来看,这有点问题,因为这意味着当查看alembic/versions目录时,所有文件将以随机顺序出现,而不是按顺序/按时间顺序出现。

Alembic中是否有任何选项可确保这些前缀修订ID是连续的?我想我可以手动重命名文件,然后更新引用,但我想知道是否已经有一个像这样的功能。

sqlalchemy database-migration alembic
1个回答
6
投票

通过它的声音,您对顺序列出的修订文件更感兴趣,而不是按顺序排列的修订ID。前者可以在不改变生成修订ID的情况下实现。

运行alembic.ini时生成的alembic init alembic文件有一个部分,用于配置修订文件的命名:

# 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历史”是最好的事实来源。

因此,文件命名解决方案不能保证迁移在逻辑上在目录中排序(但会帮助IMO)。可以针对具有顺序ID进行相同的论证。

如果您确实要指定自己的修订标识符,请在命令行中使用--rev-id标志。

Ef。:

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,则会在rev_id()中找到函数alembic.util.langhelpers

def rev_id():
    return uuid.uuid4().hex[-12:]

rev_id()的函数调用在alembic源代码中是硬编码的,因此如果没有对函数进行猴子修补,则很难覆盖该行为。您可以创建库的一个分支并重新定义该函数,或者使其为id生成调用的函数可配置。

© www.soinside.com 2019 - 2024. All rights reserved.