Есть ли способ генерировать последовательные идентификаторы ревизий в Alembic? - PullRequest
0 голосов
/ 14 ноября 2018

Я использую Alembic в качестве инструмента миграции базы данных для проекта Python.Когда я запускаю команду, подобную этой:

alembic revision -m "adding a column"

... она добавляет новый файл с именем alembic/versions/xxxxxxxxxxxx_adding_a_column.py, где xxxxxxxxxxxx - это случайно сгенерированный 12-значный хэш.

С точки зрения того, чтобы сделать вещи удобочитаемыми, это немного проблематично, потому что это означает, что при просмотре каталога alembic/versions все файлы будут отображаться в случайном порядке, а не в последовательном / хронологическом порядке.

Есть ли какие-либо опции в Alembic, чтобы гарантировать, что эти идентификаторы изменений префикса являются последовательными?Я полагаю, я мог бы переименовать файлы вручную, а затем обновить ссылки, но мне интересно, есть ли уже такая функция, как эта.

1 Ответ

0 голосов
/ 15 ноября 2018

Судя по звукам, вас больше интересуют последовательно перечисленные файлы ревизий, а не последовательно упорядоченные идентификаторы ревизий. Первый может быть достигнут без каких-либо изменений в том, как генерируются идентификаторы ревизии.

Файл 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, так что, если не считать патч-апов для функции, будет трудно изменить поведение. Вы можете создать ветвь библиотеки и переопределить эту функцию или сделать настраиваемую функцию, которую она вызывает, для генерации идентификатора.

...