Изменение таблиц базы данных в Django


Я рассматриваю возможность использования Django для проекта, который я начинаю (fyi, браузерная игра), и одна из функций, которые мне больше всего нравятся, - это использование syncdb для автоматического создания таблиц базы данных на основе моделей Django, которые я определяю (функция, которую я не могу найти в любой другой структуре). Я уже думал, что это слишком хорошо, чтобы быть правдой когда я увидел это в документация:

Syncdb не будет изменять существующие таблицы

syncdb будет создавать таблицы только для моделей, которые еще не были установлены. Он никогда не будет выдавать инструкции ALTER TABLE для сопоставления изменений, внесенных в класс модели после установки. Изменения в классах моделей и схемах баз данных часто связаны с некоторой неопределенностью, и в этих случаях Django должен был бы угадать правильные изменения. Существует риск того, что важные данные будут потеряны в процессе.

Если вы внесли изменения в модель и хотите изменить таблицы базы данных для сопоставления используйте команду sql, чтобы отобразить новую структуру SQL и сравнить ее с существующей схемой таблицы для разработки изменений.

Кажется, что изменение существующих таблиц должно быть сделано "вручную".

что я хотел бы знать, лучший способ сделать это. На ум приходят два решения:

  • как следует из документации, внесите изменения вручную в БД;
  • сделайте резервную копию базы данных, протрите он снова создает таблицы (с syncdb, так как теперь он создает таблицы с нуля) и импортирует резервные копии данных (это может занять слишком много времени, если база данных большая)

какие идеи?

8 59

8 ответов:

Как отмечено в других ответах на ту же тему, обязательно смотрите Панель Эволюции Схемы DjangoCon 2008 на YouTube.

кроме того, два новых проекта по карте: Simplemigrations и перелетных.

ручное выполнение изменений SQL и дамп/перезагрузка-это оба варианта, но вы также можете проверить некоторые пакеты schema-evolution для Django. Самые зрелые варианты django-evolution и Южный.

EDIT: и эй, вот идет dmigrations.

обновление: поскольку этот ответ был написан, django-evolution и dmigrations у обоих прекратил активное развитие и Южный стал де-факто стандартом для миграции схемы в Django. Части юга могут даже быть интегрированы в Django в следующем выпуске или двух.

обновление: схема-миграционная структура, основанная на юге (и автором которой является Эндрю Годвин, автор South), включена в Django 1.7+.

один хороший способ сделать это с помощью приспособления, в частности initial_data приспособления.

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

вы можете создать прибор из данных, находящихся в настоящее время в вашей БД с помощью django-admin.py dumpdata. По умолчанию данные в Формат JSON, но доступны и другие параметры, такие как XML. Хорошее место для хранения светильников-это fixtures подкаталог ваших каталогов приложений.

вы можете загрузить исправление с помощью django-admin.py loaddata но что еще более важно, если ваш прибор имеет название типа initial_data.json он будет автоматически загружен, когда вы делаете syncdb, экономя проблемы импорта его самостоятельно.

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

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

это лучше всего работает при выполнении большого количества небольших изменений базы данных во время разработки. Для обновления производственных баз данных лучше всего подходит сценарий SQL, созданный вручную.

Я использую django-evolution. Предостережения включают в себя:

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

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

BEFORE = 'fv1:-436177719' # first fingerprint
BEFORE64 = 'fv1:-108578349625146375' # same, but on 64-bit Linux
AFTER = 'fv1:-2132605944' 
AFTER64 = 'fv1:-3559032165562222486'

fingerprints = [
    BEFORE, AFTER,
    BEFORE64, AFTER64,
    ]

CHANGESQL = """
    /* put your SQL code to make the changes here */
    """

evolutions = [
    ((BEFORE, AFTER), CHANGESQL),
    ((BEFORE64, AFTER64), CHANGESQL)
    ]

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

EDIT: учитывая, что я все равно вручную создаю свои изменения, я попробую dmigrations в следующий раз.

django-command-extensions это библиотека django, которая дает некоторые дополнительные команды manage.py один из них-sqldiff, который должен дать вам sql, необходимый для обновления до вашей новой модели. Он, однако, указан как "очень экспериментальный".

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

У нас обычно не так много изменений схемы в производственных системах и несколько формализованных развертываний от разработки до производственных серверов. Всякий раз, когда мы выкатываем (10-20 раз в год), мы заполняем разницу текущей и предстоящей производственной ветви, просматривая весь код и отмечая, что должно быть изменено на производственном сервере. Необходимое изменения могут быть дополнительными зависимостями, изменениями в файле настроек и изменениями в базе данных.

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

книга Джанго объясняет, как это сделать вручную.

http://www.djangobook.com/en/2.0/chapter10/

Я сделал это так много раз, и это очень гибкая, что позволяет оставлять данные в таблицах при удалении их из модели.

Я начал использовать Юг недавно. Это кажется немного менее гибким (или, может быть, мне просто нужно прочитать документы еще немного.), Но может сэкономить вам немного печатать. Иногда вам удается получить его из синхронизация с базой данных, которая является кошмаром. Кажется, все идет хорошо, пока вы продолжаете использовать it.It кажется, что связывает модели и фактическую базу данных вместе, что может быть или не быть хорошей вещью в зависимости от вашей ситуации

Django 1.7 (в настоящее время в разработке) является добавление встроенной поддержки для миграции схемы manage.py migrate и manage.py makemigrations (migrate устаревшую syncdb).