Обновите схему базы данных sqlite с помощью sqlalchemy и эликсира - PullRequest
11 голосов
/ 16 апреля 2010

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

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

Ответы [ 3 ]

8 голосов
/ 16 апреля 2010

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

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

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

И вы спросили, что будет делать SQLAlchemy-migrate, если вы попытаетесь удалить столбец. Ну, это удалит столбец и удалит все данные, которые были в нем. Другие столбцы в таблице останутся без изменений.

5 голосов
/ 16 мая 2012

Более поздняя альтернатива sqlalchemy-migrate - alembic , написанная самим автором SQLAlchemy. Хотя последний («тот же автор») выглядит сильным аргументом, недостатком может быть то, что он не поддерживает таблицу ALTERation с SQLite, то есть у него нет встроенных обходных путей для отсутствующей поддержки SQLite ALTER. (Можно утверждать, что это выходит за рамки и может быть решено с помощью специального пакета Python или расширения SQLite.)

0 голосов
/ 16 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...