Судя по звукам, вас больше интересуют последовательно перечисленные файлы ревизий, а не последовательно упорядоченные идентификаторы ревизий. Первый может быть достигнут без каких-либо изменений в том, как генерируются идентификаторы ревизии.
Файл alembic.ini
, который создается при запуске alembic init alembic
, содержит раздел, в котором настраиваются имена файлов редакций:
# template used to generate migration files
# file_template = %%(rev)s_%%(slug)s
А вот объяснение из документов:
file_template - это схема именования, используемая для генерации нового
миграционные файлы. Значение по умолчанию является значением по умолчанию, поэтому оно комментируется
из. Доступные токены включают в себя:
- %% (rev) s - идентификатор редакции
- %% (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, которая указала мне в правильном направлении.
Комментарий от этой проблемы :
отметки времени не обязательно сообщают вам, какой файл является самым «последним»,
так как ветвление разрешено. «алембская история» - лучшая
источник правды в этом.
Таким образом, решение для именования файлов не гарантирует, что миграции логически упорядочены в каталоге (но поможет IMO). Тот же аргумент можно привести против последовательных идентификаторов.
Если вы хотите указать свой собственный идентификатор ревизии, используйте флаг --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>
для управления порядком, указанным в каталоге.
Если идентификатор редакции не указан, вызывается функция rev_id()
, найденная в alembic.util.langhelpers
:
def rev_id():
return uuid.uuid4().hex[-12:]
Вызовы функций для rev_id()
жестко запрограммированы в источнике alembic, так что, если не считать патч-апов для функции, будет трудно изменить поведение. Вы можете создать ветвь библиотеки и переопределить эту функцию или сделать настраиваемую функцию, которую она вызывает, для генерации идентификатора.