WedX - журнал о программировании и компьютерных науках

Обновите схему базы данных sqlite с помощью sqlalchemy и elixir

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

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


Ответы:


1

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

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

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

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

16.04.2010

2

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

16.05.2012

3

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

16.04.2010
Новые материалы

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

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]