Сценарий миграции Alembic для представления MySQL с использованием DATE_FORMAT

Мы пытаемся создать сценарий миграции SQL с помощью Alembic (автономный режим). Часть представления при миграции использует функцию MySQL DATE_FORMAT, как в примере ниже. При создании сценариев миграции символы процента удваиваются в сгенерированном SQL.

Мы вручную модифицировали сгенерированные скрипты, чтобы вместо этого вернуть их к одному символу %, но хотели бы отказаться от этой практики и чтобы наши обновления/понижения генерировали SQL, который можно было бы передать в БД без ручной модификации.

Из того, что мне удалось определить, запуск миграции Alembic в онлайн-режиме с параметром no_parameters = True, установленным в параметрах выполнения, позволяет: «...процентные знаки проходят без экранирования, что обеспечивает кросс-совместимую операцию с выполнением DBAPI. и создание статического скрипта."

(см. https://alembic.readthedocs.org/en/latest/changelog.html#change-1dff9e522d76403d9af885164fd284e9 )

Поскольку execute_options задаются как свойство соединения, а соединение отсутствует при работе в автономном режиме, этот вариант для нас не подходит.

Любая помощь или совет будут высоко оценены!

=======================

Файл миграции Alembic:

def upgrade():
    my_view_sql = """
        CREATE VIEW my_view
        AS        
        SELECT DATE_FORMAT(m.my_date, '%m/%d/%Y') AS 'my_date'
        FROM    some_table as m
    """
    op.execute(my_view_sql)

======================

Сгенерированный SQL:

-- Running upgrade old_version -> new_version

CREATE VIEW my_view
        AS
        SELECT DATE_FORMAT(m.my_date, '%%m/%%d/%%Y') AS 'my_date'
        FROM    some_table as m;

UPDATE alembic_version SET version_num='new_version';

person Scott Grussing    schedule 30.09.2013    source источник


Ответы (1)


inline_literal звучит как то, что вам нужно.

person javex    schedule 01.10.2013
comment
Я просмотрел связанную документацию и не смог применить ее в этом контексте. Я пробовал: (1) передать оператор в inline_literal(). Alembic выплевывает его неправильно. (2) Объединив его в строку как ...my_date, + op.inline_literal('%m/%d/%y') + ... Alembic произвел: concat(concat(%s, '%m/%d /%Y'), %s); (3) Используя .format(op.inline_literal('%m/%d/%y')), вернул оператор CREATE в том виде, в котором он был изначально (с двойным %%). Если бы вы могли указать пример использования inline_literal, где он вставляется в существующую строку, я был бы очень признателен. - person Scott Grussing; 01.10.2013