Как эффективно управлять частыми изменениями схемы с помощью sqlalchemy?
Я программирую веб-приложение, используя sqlalchemy. Все было гладко на первом этапе разработки, когда сайт не работал. Я мог бы легко изменить схему базы данных, просто удалив старую базу данных sqlite и создав новую с нуля.
Сейчас сайт находится в рабочем состоянии, и мне нужно сохранить данные, но я все еще хочу сохранить первоначальную скорость разработки, легко преобразовав базу данных в новую схему.
Итак, предположим, что у меня есть model.py в ревизии 50 и model.py в ревизии 75, описывающей схему базы данных. Между этими двумя схемами большинство изменений тривиально, например, новый столбец объявлен со значением по умолчанию, и я просто хочу добавить это значение по умолчанию к старым записям.
В конце концов, некоторые изменения могут быть не тривиальными и требуют предварительного вычисления.
Как (или вы) будете обращаться с быстро меняющимися веб-приложениями, скажем, с одной или двумя новыми версиями рабочего кода в день?
Кстати, сайт написан на Pylons, если это имеет какое-либо значение.
4 ответа
Alembic - это новый инструмент миграции баз данных, написанный автором SQLAlchemy. Я нашел, что это намного проще в использовании, чем sqlalchemy-migrate. Он также без проблем работает с Flask-SQLAlchemy.
Автоматически сгенерируйте скрипт миграции схемы из ваших моделей SQLAlchemy:
alembic revision --autogenerate -m "description of changes"
Затем примените новые изменения схемы к вашей базе данных:
alembic upgrade head
Более подробная информация здесь: http://readthedocs.org/docs/alembic/
Что мы делаем.
Используйте "главную версию"."Младшая версия" идентификация ваших приложений. Основной версией является номер версии схемы. Главное число - это не какая-то случайная "достаточно новая функциональность". Это формальное объявление совместимости со схемой базы данных.
Выпуск 2.3 и 2.4 оба используют схему версии 2.
Выпуск 3.1 использует схему версии 3.
Сделайте версию схемы очень и очень заметной. Для SQLite это означает сохранение номера версии схемы в имени файла базы данных. Для MySQL используйте имя базы данных.
Написание скриптов миграции. 2to3.py, 3to4.py. Эти сценарии работают в два этапа. (1) Запросите старые данные в новую структуру, создав простые файлы CSV или JSON. (2) Загрузите новую структуру из простых файлов CSV или JSON без дальнейшей обработки. Эти извлекаемые файлы - потому что они имеют правильную структуру, быстро загружаются и могут легко использоваться как приспособления для модульного тестирования. Кроме того, у вас никогда не бывает двух открытых баз данных одновременно. Это делает сценарии немного проще. Наконец, файлы загрузки могут быть использованы для перемещения данных на другой сервер базы данных.
"Автоматизировать" миграцию схемы очень и очень сложно. Операция с базой данных настолько глубока (и распространена), что автоматизированный сценарий не может легко отобразить данные из старой схемы в новую.
Используйте sqlalchemy-migrate.
Он предназначен для поддержки гибкого подхода к проектированию баз данных и упрощения синхронизации баз данных разработки и производства по мере необходимости изменения схемы. Это упрощает управление версиями схемы.
Думайте об этом как о контроле версий для вашей схемы базы данных. Вы фиксируете каждое изменение схемы в нем, и оно сможет идти вперед / назад по версиям схемы. Таким образом, вы можете обновить клиент, и он будет точно знать, какой набор изменений применить к базе данных этого клиента.
Он делает то, что предлагает С.Лотт в своем ответе, автоматически для вас. Делает трудную вещь легкой.
Лучший способ справиться с вашей проблемой - отразить вашу схему, а не декларативно. Я написал статью о рефлексивном подходе здесь: http://petrushev.wordpress.com/2010/06/16/reflective-approach-on-sqlalchemy-usage/ но есть и другие ресурсы по этому поводу. Таким образом, каждый раз, когда вы вносите изменения в свою схему, все, что вам нужно сделать, это перезапустить приложение, и отражение извлечет новые метаданные для изменений в таблицах. Это довольно быстро, и sqlalchemy делает это только один раз за процесс. Конечно, вам придется управлять изменениями отношений, которые вы делаете сами.