Обновите sqlite схему базы данных с sqlalchemy и эликсиром

Я создал приложение Python, которое использует elixir/sqlalchemy, чтобы хранить данные. Второй релиз программного обеспечения требует, чтобы любые файлы, созданные в предыдущей версии, были обновлены, для добавления/удаления таблиц и столбцов.

Мой вопрос: как я могу достигнуть этого? Я знаю, sqlalchemy-мигрируют, но я должен сказать, что нахожу это сбивающим с толку. Это не упоминает то, что происходит с существующими данными. Кроме того, sqlite уменьшил поддержку ALTER TABLE, поэтому что мигрирует, делают, если я пытаюсь удалить столбец? Там какие-либо другие подходы к использованию, мигрируют?

11
задан Ben 15 June 2013 в 14:41
поделиться

2 ответа

То, о чем вы говорите, - хорошо известная и довольно сложная проблема. Это известно как миграция базы данных. В каждом хорошем проекте есть политика, описывающая, как следует применять схему базы данных и мутации данных для перехода от одной версии продукта к другой.

Многие фреймворки, такие как Django или Ruby on Rails, имеют встроенную систему миграции или доступную в виде плагина. В вашем случае с SQLAlchemy есть несколько вариантов:

  1. Не использовать никакую систему. Просто напишите вручную /tmp/migrate.sql , запишите операторы ALTER / DROP / CREATE, скрестите пальцы и примените их к своей базе SQLite. Как правило, это плохая идея, поскольку она подвержена ошибкам, но выбор остается за вами. Отсутствие полнофункционального оператора ALTER TABLE можно обойти, создав новый столбец с желаемыми свойствами с временным именем, скопировав в него все данные из исходного столбца, удалив исходный столбец и переименовав новый столбец в исходное имя. . Тот же метод можно использовать на уровне таблицы.
  2. Используйте стороннюю систему миграции, например Liquibase . Liquibase классная, хорошо спроектированная и мощная, за исключением одного недостатка. Это действительно глючит. Я пробовал его для SQLite (и да, для SQLAlchemy, но на самом деле это не имеет значения), и он не смог сделать некоторые довольно простые вещи. Я поискал в Google проблемы и обнаружил, что это известные ошибки.
  3. Используйте SQLAlchemy-migrate, о котором вы упомянули. Он не такой мощный, как ROR-миграции, на которые он был вдохновлен, и не такой мощный, как Liquibase, но он работает. Таким же образом можно обойти ограничение SQLite.

И вы спрашивали, что сделает SQLAlchemy-migrate, если вы попытаетесь удалить столбец. Что ж, он удалит столбец и, таким образом, удалит все данные, которые в нем были. Остальные столбцы в таблице останутся нетронутыми.

8
ответ дан 3 December 2019 в 08:54
поделиться

Что вас смущает в sqlalchemy-migrate? У него есть параметры --preview_sql и --preview_py для предварительного просмотра того, что он собирается делать. В общем, невозможно выполнить правильную миграцию для любого возможного случая, но вы можете изменить сгенерированный скрипт миграции в соответствии со своими потребностями. На остальное легко получить ответы, попробовав его.

0
ответ дан 3 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: