2010-11-12 3 views
39

Я программирую веб-приложение с использованием sqlalchemy. На первом этапе разработки все было гладко, когда сайт не был в производстве. Я мог бы легко изменить схему базы данных, просто удалив старую базу данных sqlite и создав новую с нуля.Как эффективно управлять частыми изменениями схемы с использованием sqlalchemy?

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

Предположим, что у меня есть model.py в ревизии 50 и model.py ревизии 75, описывающей схему базы данных. Между этими двумя схемами большинство изменений тривиальны, например, новый столбец объявлен со значением по умолчанию, и я просто хочу добавить это значение по умолчанию к старым записям.

В конечном счете несколько изменений могут быть не тривиальными и требуют предварительного вычисления.

Как обрабатывать быстро изменяющиеся веб-приложения, скажем, одну или две новые версии производственного кода в день?

Кстати, сайт написан на Pylons, если это имеет значение.

+1

«Так стоит ли мигрировать? " должен быть отдельный вопрос. У вас есть ответ о том, как мигрировать. Просьба о случаях использования для sqlalchemy-migrate и ваш конкретный вариант использования для более конкретного, чем этот общий вопрос. –

+1

ОК, поэтому мне нужно задать еще один вопрос о миграции, чтобы узнать, какой ответ принять. – ascobol

+1

@ascobol: «Еще один вопрос о миграции, чтобы узнать, какой ответ принять». Ложь. У вас есть ответы здесь. «Это инструмент [X] стоит?» не имеет отношения к «как мне перейти?». У вас есть ответы на «как?». Спросить о значении одного конкретного инструмента не имеет отношения к «как?» –

ответ

33

Alembic - это новый инструмент миграции баз данных, написанный автором SQLAlchemy. Я нашел его намного проще в использовании, чем sqlalchemy-migrate. Он также прекрасно работает с Flask-SQLAlchemy.

Автоматическое создание миграционного сценария схема из ваших моделей SQLAlchemy:

alembic revision --autogenerate -m "description of changes" 

Затем применить новые изменения схемы в базу данных:

alembic upgrade head 

Больше информации здесь: http://readthedocs.org/docs/alembic/

+0

Я согласен, но немного сложно заставить его работать с вашим флеш-приложением. Я думаю, что новый код «flask-alembic» - это то, что мне нужно проверить. Проверьте эту проблему: http://stackoverflow.com/questions/14682466/relative-importing-python-module-from-a-subfolder-from-a-different-subfolder#comment20531813_14682466 – Dexter

+2

После запуска 'alembic init alembic' и изменения моего db имя пользователя и пароль в alembic.ini, я изменил свой файл alembic/env.py на это: https://gist.github.com/alanhamlett/4721073 Это было все, что нужно для того, чтобы получить работу с моим флеш-приложением , Надеюсь, поможет. –

+0

моя проблема в том, что я не могу сделать строку 10 в вашем коде gist. Я не могу импортировать свои модели или свою переменную «db». Это не позволит мне сделать это в env.py. – Dexter

12

Что мы делаем.

  1. Использовать «основную версию». «Младшая версия» идентификации ваших приложений. Основная версия - номер версии схемы. Основное число - это не какая-то случайная «достаточно новая функциональность». Это формальное объявление о совместимости с схемой базы данных.

    Выпуск 2.3 и 2.4 и использование схемы версии 2.

    Выпуск 3.1 использует схему версии 3.

  2. Сделать версию схемы очень и очень заметной. Для SQLite это означает, что номер версии схемы указан в имени файла базы данных. Для MySQL используйте имя базы данных.

  3. Запись сценариев миграции. 2to3.py, 3to4.py. Эти скрипты работают в два этапа. (1) Запрос старых данных в новую структуру, создающую простые файлы CSV или JSON. (2) Загрузите новую структуру из простых файлов CSV или JSON без дальнейшей обработки. Эти файлы извлечения - потому что они находятся в правильной структуре, быстро загружаются и могут быть легко использованы в качестве модульных испытательных приборов. Кроме того, вы никогда не открываете две базы одновременно. Это делает скрипты немного проще. Наконец, файлы загрузки могут использоваться для перемещения данных на другой сервер базы данных.

Очень сложно «автоматизировать» миграцию схемы. Легко (и распространено), что операция базы данных настолько глубока, что автоматизированный сценарий не может легко сопоставить данные старой схемы с новой схемой.

+0

Как вы определяете изменение главной схемы? Является ли добавление таблицы/новой модели рассматриваемой основной схемой, даже если совместимость не изменилась? Вы конкурируете с firefox в номерах версий? (шутка) – Dexter

12

Использование sqlalchemy-migrate.

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

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

Он делает то, что S.Lott предлагает в своем ответе автоматически для вас. Делает все, что легко.

0

Лучший способ справиться с вашей проблемой состоит в том, чтобы отразить вашу схему, вместо этого сделать декларативный путь. Я написал статью об рефлексивном подходе здесь: http://petrushev.wordpress.com/2010/06/16/reflective-approach-on-sqlalchemy-usage/ , но есть и другие ресурсы об этом. Таким образом, каждый раз, когда вы вносите изменения в свою схему, все, что вам нужно сделать, это перезапустить приложение, и отражение отобразит новые метаданные для изменений в таблицах. Это довольно быстро, и sqlalchemy делает это только один раз за процесс. Конечно, вам придется управлять изменениями отношений, которые вы делаете сами.

+5

Просто для комментариев, это ужасная практика в реальном мире. Это заставляет меня проверять базу данных и код для всех видов настроек, таких как длины, разрешенные для строк, и т. Д. Я не получаю никаких автозаполнений или исходных проверок из моей IDE. Я действительно препятствую тому, чтобы люди все отражали в любом проекте. Это просто беспорядок для работы. – Rick

+2

«всевозможные настройки, такие как длины, разрешенные для строк» ​​- можете ли вы рассказать об этом? Какие настройки? И только потому, что вы не получаете никакой автозаполнения в ide, это не значит, что подход неправильный. В конце концов, мы имеем дело с python - не java/C++. – vonPetrushev

+0

Кроме того, у меня есть приложения в реальном мире, которые работают с db-отражением. Со сложными ER. Для меня это не так. – vonPetrushev

Смежные вопросы