Джанго: Менять модели без очистки всех данных? - PullRequest
16 голосов
/ 30 апреля 2010

У меня есть несколько моделей, с которыми я работаю в новой установке Django. Можно ли изменить поля без потери данных приложения?

Я попытался изменить поле и запустить python manage.py syncdb. От этой команды не было вывода.

Повторное перемещение на страницы администратора для редактирования измененных моделей вызвало TemplateSyntaxErrors, поскольку Django пытался отобразить поля, которых не было в БД.

Я использую SQLite.

Я могу удалить файл базы данных, а затем повторно запустить python manage.py syncdb, но это своего рода боль. Есть ли лучший способ сделать это?

Ответы [ 3 ]

20 голосов
/ 30 апреля 2010

Django никогда не изменяет существующий столбец базы данных. Syncdb создаст таблицы, но не выполняет «миграцию», как, например, в Rails. Если вам нужно что-то подобное, проверьте Django South .

См. документы для syndb :

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

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

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

Вы должны изменить имена столбцов в вашей БД вручную с помощью любых инструментов администрирования, которые предоставляет sqlite. Я сделал это, например, с MySQL, и, поскольку MySQL позволяет изменять имена столбцов, не затрагивая ваши данные, это не проблема.

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

Конечно, есть.
Выезд Юг

5 голосов
/ 30 апреля 2010

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

Если вы пытаетесь переименовать столбец, вам придется найти другой путь.

Вы можете использовать команду python manage.py sql [app name] (http://docs.djangoproject.com/en/dev/ref/django-admin/#sql-appname-appname)), чтобы посмотреть, как должен выглядеть новый SQL, посмотреть, какие столбцы, какого типа / спецификации Django вы бы добавили, а затем вручную запустить соответствующий ALTER TABLE команд.

Существуют некоторые приложения / проекты, которые позволяют упростить управление моделью / БД, но Django не поддерживает это из коробки, специально или специально.

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