Будут ли миграции Flask-Migrate работать в разных механизмах баз данных?

Я пишу приложение Flask, которое использует Flask-SQLAlchemy и Flask-Migrate. В рабочей среде есть база данных PostgreSQL, но для разработки я надеялся использовать SQLite вместо того, чтобы устанавливать полную версию PostgreSQL на моем компьютере для разработки.

Я настроил Flask-Migrate, как описано в документации. Я не могу не заметить, что когда я запускаю flask db migrate в окне разработчика, это первые две строки, записанные в консоль:

INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.

Мой вопрос: означает ли это, что сгенерированный скрипт миграции подходит только для SQLite?

Я бы не ожидал, так как вы должны передать сценарий в систему управления версиями (после того, как вы проверите его вручную) и использовать его для миграции в производстве. И сам автор Flask-Migrate признает, что одним из преимуществ SQLAlchemy является то, что вы можете использовать разные механизмы баз данных при разработке и производстве (см. его сообщение в блоге). Но тогда почему он говорит мне об этих предположениях? Есть ли способ сказать ему, чтобы он не использовал конкретный механизм базы данных?


person Dominick Pastore    schedule 03.12.2019    source источник


Ответы (1)


Сообщение Context impl SQLiteImpl, которое печатает Alembic, на самом деле является результатом URL-адреса базы данных, настроенного в вашем приложении. Этот URL-адрес передается в Alembic, который выделяет подходящий драйвер для выбранной вами базы данных. В вашей производственной среде вместо этого вы увидите Context impl PostgresqlImpl.

Использование разных баз данных в разработке и производстве — это нормально, но вы должны быть осторожны, чтобы содержимое ваших миграций было достаточно общим, чтобы оно работало в обоих случаях. Очевидно, вы не сможете использовать специфические функции Postgres или SQLite. Я также рекомендую добавить промежуточный сервер, который также основан на Postgres, где вы сможете протестировать свои миграции перед их запуском в рабочей среде.

person Miguel    schedule 04.12.2019
comment
Спасибо. Я предполагаю, что неясно, какие особенности Postgres или SQLite даже имеют значение в сценарии. Например, у меня есть таблица со столбцом Enum. В SQLite нет типа Enum, но Alembic по-прежнему создает столбец Enum в сценарии миграции. Так что это не проблема; он не преобразуется в тип, специфичный для двигателя, до этапа обновления. Итак, если такие различия двигателей не имеют значения для Alembic, то какие именно? - person Dominick Pastore; 04.12.2019
comment
Я полагаю, что мне действительно интересно следующее: следует ли интерпретировать контекстное сообщение как означающее, что мы пытаемся сгенерировать общий сценарий, но некоторые артефакты SQLite могут появиться по необходимости, или это означает, что мы оптимизируем сценарий миграции для SQLite? - person Dominick Pastore; 04.12.2019
comment
Это просто означает, что сценарии миграции будут выполняться драйвером SQLite в Alembic. Как я сказал в своем ответе, при работе с разными базами данных лучше постоянно проверять, что вы случайно не создаете миграцию, которая работает в одной, но не работает в другой. Промежуточный сервер, на мой взгляд, обязателен. - person Miguel; 05.12.2019
comment
Я определенно планировал воспользоваться вашим советом по промежуточному серверу. Меня беспокоит то, что я пропущу проблему при тестировании, так как я все еще изучаю SQLAlchemy. Поэтому полезно знать, работает ли сценарий миграции с минимальным обобщением, более вероятно, что я что-то упустил или он действительно правильный. В любом случае, спасибо, это было полезно. - person Dominick Pastore; 05.12.2019
comment
Собственно, еще одно уточнение, если не возражаете. Когда вы сказали, что содержимое ваших миграций должно быть достаточно общим, я предположил, что вы имели в виду, что мне нужно обобщить сценарий миграции. Но вы просто хотели убедиться, что я использую только функции SQLAlchemy, поддерживаемые обеими базами данных? - person Dominick Pastore; 05.12.2019
comment
Вы, вероятно, слишком беспокоитесь о том, что я сказал, возможно, потому, что я представил это так, как будто было бы слишком просто сделать что-то, что нарушит совместимость между базами данных. По моему опыту, пока вы остаетесь с примитивными типами столбцов, все будет в порядке. Однако следует иметь в виду, что SQLite не применяет размеры столбцов, в отличие от других баз данных. Поэтому, если вы определите столбец с размером, который слишком мал для того, что вы в нем пишете, вы не заметите этого, пока не запустите свой код в Postgres. - person Miguel; 06.12.2019