django syncdb та оновлену модель


86

Я нещодавно оновив свою модель, додав до неї BooleanField, однак, коли я це роблю python manage.py syncdb, це не додає нове поле до бази даних для моделі. Як я можу це виправити?


17
Той факт, що Django не підтримує такої фундаментальної речі нестандартно, заважав мені взагалі використовувати її для створення моделей. Той факт, що вони вважають ORM, який обробляє створення таблиці, але не (на місці) модифікацію таблиці, як якість випуску, майже не дозволив мені повністю використовувати Django.
Гленн Мейнард,

3
Той факт, що Django дозволяє настільки велику можливість підключення додатків, робить Django чудовим і робить його відсутність вбудованої підтримки для модифікації таблиці в основному неактуальною. Наскільки важко встановити програму?
Домінік Роджер

@Glenn, правильно плануйте свої моделі на етапі проектування, і у вас не буде цієї проблеми. Якщо ви додаєте нові функції, тоді використовуйте пакет міграції, такий як South. Міграції на місці часто ускладнюються; так чи інакше занадто складна для простої команди управління Django.
Soviut

Відповіді:


100

Починаючи з Django 1.7 і далі

Django вбудував підтримку міграцій - подивіться на документацію .

Для Django 1.6 та раніше

Django не підтримує міграції з коробки. Існує додаткова програма для Django, яка робить саме це, і вона чудово працює. Це називається Південь .


1
Примітка: У мене була проблема з використанням Південь для перенесення моделей з призначеної для користувача БД бекенда (наприклад , Джанго-MSSQL)
Дон

1
Південь дуже дуже приємний! Дякую за підказку
Julien Greard

14

На даний момент Django не робить цього автоматично. Ваші варіанти:

  1. Видаліть таблицю з бази даних, а потім відтворіть її в новій формі за допомогою syncdb.
  2. Роздрукуйте SQL для бази даних за допомогою python manage.py sql (appname), знайдіть доданий рядок для поля та додайте його вручну за допомогою alter tableкоманди SQL. (Це також дозволить вам вибрати значення поля для ваших поточних записів.)
  3. Використовуйте південь (відповідно до відповіді Домініка ).

11

Виконайте такі дії:

  1. Експортуйте дані у пристрій за допомогою команди керування dumpdata
  2. Опустіть стіл
  3. Запустіть syncdb
  4. Перезавантажте дані з приладу за допомогою команди керування loaddata

Повне скидання та перезавантаження для чогось, що слід робити на місці? Це жахливо.
Гленн Мейнард,

3
Це проста команда управління, а не пакет міграції! Django не може передбачити, як змінилися ваші дані або як їх зберегти, тому наполягає на тому, що ви робите це самостійно. Якщо вам це не подобається, скористайтеся інструментом міграції, як Південь.
Soviut

8

Як було запропоновано у верхній відповіді, я спробував використовувати South , і після години розчарування неясними помилками міграції вирішив замість цього скористатися Django Evolution .

Я думаю, що починати з цього легше, ніж із Півдня, і він працював чудово, коли я друкував вперше ./manage.py evolve --hint --execute, тому я цим задоволений.


7
Після того, як я майже рік користувався Django Evolution та South, я змінюю свою думку. Південь чудовий. Але це дуже схоже на Git в тому сенсі , щоб переконатися, що ви справді розумієте, як це працює . Якщо ви вводите команди наосліп, швидше за все, ви зіпсуєте перший раз, коли ви або хтось із вашої команди помилиться.
Дан Абрамов

2

Хавент деякий час використовував django, але, схоже, я пам'ятаю, що syncdb виконує команди alter у таблицях db. вам слід скинути таблицю, а потім запустити її знову, і вона створить знову.

редагувати: вибачте, НЕ виконує зміну.


Тоді це не запущені alter tableкоманди, це запущені create tableкоманди.
Домінік Роджер

ну, у мене є дані в базі даних, тому було б чудово, якби я подолав цю проблему, не скидаючи.
Hellnar

1
Я думаю, ви хотіли сказати, що syncdb НЕ виконує команди alter. Вам не потрібно скидати таблицю, ви також можете вручну додати нове поле до вашого sql.
Одіф Ільцаб

так, але питання стосувалось використання syncdb, тому в цьому випадку вам доведеться скинути таблицю, щоб використовувати syncdb або використовувати плагін, згаданий нижче.
Alex H

1
Якщо ви розчаровані Півднем, спробуйте замість цього Django Evolution. У мене приємно вийшло. stackoverflow.com/questions/1605662/…
Ден Абрамов


0

Якщо ви запускаєте Django з Apache та MySQL, перезапустіть apache після перенесення за допомогою makemigrations .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.