Django 1.7 - макеміграції не виявляють змін


140

Як видно з назви, я, здається, міграції не можуть працювати.

Додаток спочатку був менше 1,6, тому я розумію, що міграції спочатку не буде, і якщо я запускаю, python manage.py migrateотримую:

Operations to perform:
  Synchronize unmigrated apps: myapp
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Running migrations:
  No migrations to apply.

Якщо я внесу зміни в будь-яку модель myapp, вона все одно говорить про переселення, як очікувалося.

Але якщо я біжу, python manage.py makemigrations myappотримую:

No changes detected in app 'myapp'

Здається, неважливо, що і як я запускаю команду, вона ніколи не визначає додаток як зміни, а також не додає файлів міграції до програми.

Чи є який-небудь спосіб змусити додаток до міграцій і, по суті, сказати "Це моя основа для роботи" чи що-небудь? Або я щось пропускаю?

Моя база даних - це PostgreSQL, якщо це взагалі допомагає.


Пропоновані рішення не спрацювали для мене, тому ось моє рішення, якщо хтось стикається з тією ж проблемою! 1. Видаліть файли міграції під усіма програмами 2. Видаліть базу даних та створіть її знову 3. запустіть макеміграції та команди міграції PS Спробуйте спочатку кроки 1 та 3. Якщо помилка все-таки є, виконайте кроки 1-3.
Аморосо

Відповіді:


187

Якщо ви переходите з наявного додатка, створеного в django 1.6, вам потрібно зробити один попередній крок (як я з'ясував), вказаний у документації:

python Manag.py makemigrations your_app_label

У документації не стає очевидним, що вам потрібно додати ярлик програми до команди, оскільки перше, що вам скаже, зробити це - python manage.py makemigrationsце не вдасться. Початкова міграція проводиться, коли ви створюєте додаток у версії 1.7, але якби ви прийшли з версії 1.6, це не було б здійснено. Докладніше див. У розділі "Додавання міграції до додатків" у документації.


1
Гарна відповідь для людей, які приїжджають з Django 1.6! Дякую!
Девід Д.

1
Що робити, якщо у мене набагато більше одного додатка? Чи повинен я python manage.py makemigrations APP_LABELдля кожного з них?
Альстон

1
Під Django 1.9 тут і було створено моє додаток ./manage.py startapp, але мені все одно довелося чітко згадати етикетку
maxbellec

50

Це може статися з наступних причин:

  1. Ви не додали додаток до INSTALLED_APPSсписку в settings.py (Ви повинні додати або ім’я програми, або пунктирний шлях до підкласу AppConfig в apps.py в папці додатків, залежно від версії джанго, яку ви використовуєте). Довідкова документація: INSTALLED_APPS
  2. У вас немає migrationsпапки всередині цих додатків. (Рішення: просто створіть цю папку).
  3. У вас немає __init__.pyфайлу всередині migrationsпапки цих програм. (Рішення. Просто створіть порожній файл з ім'ям __init__.py )
  4. У вас немає __init__.pyфайлу всередині папки додатків. (Рішення. Просто створіть порожній файл з ім'ям __init__.py )
  5. У вас немає models.pyфайлу в додатку
  6. Ваш клас Python (повинен бути моделлю) в models.pyне успадковуєтьсяdjango.db.models.Model
  7. У вас є семантична помилка у визначенні моделей в models.py

Примітка . Поширена помилка - додавання migrationsпапки у .gitignoreфайл. При клонуванні з віддаленого репо- migrationsфайлу папки та / або __init__.pyфайли будуть відсутні в локальній репо-файлі. Це спричиняє проблеми.

Я пропоную gitignore міграційні файли, додавши у .gitignoreфайл наступні рядки

*/migrations/*
!*/migrations/__init__.py

1
Я клонував свій проект, і папка міграцій не була висунута до репо, тому мені довелося додати директора міграцій, потім я додав init .py і мені вдалося зробити міграцію. Завдяки вам
Джунайд

Я видалив вміст своєї папки / міграції, щоб "скинути" речі в проекті, який я ще не розгорнув. Я випадково видалив __init__.pyпапку разом із міграціями.
Сет

Це зробило це для мене .... You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py).., і це було викликано додаванням файлів до.gitignore
lukik

1
Чому файл init .py настільки важливий у папці міграцій? Де я можу глибше копатися для цієї логіки?
Німіш Бансал

1
Файл @NimishBansal Till python 3.3 __init__.pyпотрібен всередині каталогу, щоб його розглядати як пакет python. дивіться це
Мохаммед Шаріф C

29

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

Під час оновлення до 1.7 мої моделі стали некерованими ( managed = False) - я мав їх, як і Trueраніше, але, схоже, це повернулося.

Видаливши цей рядок (за замовчуванням до True), а потім запустившись, makemigrationsмиттєво зробив модуль міграції, і тепер він працює. makemigrationsне працюватиме над керованими таблицями (Що очевидно в оглядах)


4
Поясніть, будь ласка, де ви змінили / додали "керований = помилковий"? У мене те саме питання
Ycon

1
У мене цього коду більше немає, але я вважаю властивістю класу, якщо я правильно його пам’ятаю.
TyrantWave

1
Гарна думка. Зауважте, що manage.py inspectdbдодано управління = Неправда! якщо ви імпортуєте застарілі бази даних, ви повинні ретельно їх налаштувати!
Алессандро Дентелла

@TyrantWave, ти врятував мені день. Дуже дякую.
Utkarsh Sharma

переконайтесь, що ваше те app_labelсаме
Luv33preet

19

Тут не було висвітлено моє рішення, тому я його публікую. Я використовував syncdbдля проекту - просто для того, щоб розпочати його та запустити. Потім, коли я спробував почати використовувати міграцію Джанго, спершу це підробило їх, тоді сказали б, що це "добре", але з базою даних нічого не відбувається.

Моє рішення полягало в тому, щоб просто видалити всі файли міграції для мого додатка, а також записи бази даних для міграцій додатків у django_migrationsтаблиці.

Тоді я просто зробив початкову міграцію з:

./manage.py makemigrations my_app

далі:

./manage.py migrate my_app

Тепер я можу без проблем робити міграцію.


FYI: критично, що він говорить тут, "файли, а також записи бази даних". Якщо ви видалите записи з бази даних, але не файли також (за винятком випадків __init.py__, це не буде працювати.
Майк Робінсон,

15

Погодьтеся з @furins. Якщо все здається в порядку, і все ж виникає ця проблема, перевірте, чи існує який-небудь метод властивості з тим же заголовком, що і атрибут, який ви намагаєтеся додати в класі Model.

  1. Видаліть метод із подібною назвою як атрибут, який ви додаєте.
  2. manage.py makemigrations my_app
  3. manage.py мігрувати my_app
  4. Додайте методи назад.

11

Це начебто дурна помилка, але якщо додаткова кома в кінці рядка декларації поля в класі моделі, це робить рядок ніякого ефекту.

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

Хоча, можливо, це комусь допоможе :-)


1
Ваш коментар допоміг мені знайти мою проблему! У кінці останнього вибору у списку варіантів у мене не було кома. Мабуть, Джанго дуже зворушливий.
Максим

1
@Maxim: це навряд чи було причиною вашої проблеми: список без коми в кінці все ще є списком. Інша справа - кортежі: якщо у вас є лише 1 елемент в кортежі, вам знадобиться кома після нього.
blueFast

чувак, який врятував мені багато часу! @dangonfast: у визначенні моделі це справді проблема.
MrE

11

Можливо, я запізнився, але ти намагався мати migrationsпапку у своєму додатку з __init__.pyфайлом у ній?


1
Якщо у вас є ці "макеміграції", вони створюватимуть міграції для програми. В іншому випадку вам потрібно буде запустити makemigrations app_name (який створює ці файли)
Скотт Уоррен

7

Можливо, це комусь допоможе. Я використовував вкладений додаток. project.appname, і я фактично мав проект і ім'я проекту.Імена в INSTALLED_APPS. Видалення проекту з INSTALLED_APPS дозволило виявити зміни.


7

Відповідь на це повідомлення про stackoverflow, автор cdvv7788 Міграція в Django 1.7

Якщо ви вперше переносите цей додаток, який вам доведеться використовувати:

Управління.py makemigrations myappname Після цього ви можете зробити:

Manag.py migrate Якщо у вас було додаток у базі даних, ви модифікували його модель та не оновлювали зміни макеміграцій, ви, мабуть, ще не перенесли її. Поверніть свою модель до початкової форми, запустіть першу команду (з назвою програми) та перемістіть ... це підробить її. Як тільки ви це зробите, поверніть зміни на вашій моделі, запустіть макеміграції та перенесіть знову, і це має спрацювати.

У мене були ті самі проблеми, і вищезгадане працювало чудово.

Я перемістив додаток "Джанго" на cloud9, і чомусь я ніколи не потрапляв на початкову міграцію.


7

Наступні працювали для мене:

  1. Додайте ім’я програми до settings.py
  2. використовувати "python Manag.py makemigrations"
  3. використовувати "python management.py migrate"

Для мене працювали: Python 3.4, Django 1.10


6

Такі люди, як я, які не люблять міграції, можуть скористатися наведеними нижче кроками.

  1. Видаліть зміни, які потрібно синхронізувати.
  2. Виконати python manage.py makemigrations app_labelдля початкової міграції.
  3. Запустіть python manage.py migrateдля створення таблиць перед тим, як внести зміни.
  4. Вставте зміни, які ви видалите на першому кроці.
  5. Виконати 2. і 3. кроки.

Якщо ви переплутали будь-який із цих кроків, прочитайте файли міграції. Змініть їх, щоб виправити схему або видалити непотрібні файли, але не забудьте змінити частину залежності наступного файлу міграції;)

Я сподіваюся, що це допоможе комусь у майбутньому.


5

Ви хочете перевірити settings.pyв INSTALLED_APPSсписку і переконатися, що всі програми з моделями вказані там.

Запуск makemigrationsу папці проекту означає, що він буде шукати оновлення всіх таблиць, пов’язаних із усіма програмами, включеними в settings.pyпроект. Щойно ви включите його, makemigrationsавтоматично включить додаток (це економить багато роботи, тому вам не доведеться запускати makemigrations app_nameкожен додаток у вашому проекті / сайті).


5

Про всяк випадок, якщо у вас є конкретне поле, яке не визначається макеміграціями: перевірте двічі, чи є у вас властивість з тим самим іменем.

приклад:

field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)

# ... later

@property
def field(self):
    pass

властивість "перезапише" визначення поля, щоб зміни не були визначені makemigrations


Пов’язаний пробіл має мати неправильне поле, яке все ще не дозволяє перевірити / перевірити. Я визначив hourly_rate = models.DecimalField(відсутній пробіл '()'), і він просто беззвучно провалився.
шавлія

5

Переконайтесь, що ваша модель - ні abstract. Я фактично зробив цю помилку, і це зайняло деякий час, тому я подумав, що опублікую її.


4

Додавши цю відповідь, тому що мені допоміг лише цей метод.

Я видалив migrationsпапку запуску makemigrationsі migrate.
Все ще сказано: Ніяких міграцій не застосовувати.

Я перейшов до migrateпапки та відкрив останній створений файл,
прокоментував міграцію, яку я хотів (її було виявлено та введено туди)
та запустити migrateще раз.

Це в основному редагування файлу міграцій вручну.
Робіть це лише в тому випадку, якщо ви розумієте вміст файлу.


1
Дуже дякую! Це допомогло
Sharpless512

3

Ви користувалися schemamigration my_app --initialпісля перейменування старої папки міграції? Спробуй це. Могла працювати. Якщо ні - спробуйте відтворити базу даних і зробити syncdb + міграцію. Це працювало для мене ...


10
Немає команди schemamigration- я думаю, що це частина Півдня? Наразі у мене немає папки міграції. Видалення моїх models.pyі повторення inspectdb, здавалося, нічого не робило.
TyrantWave

2
schemamigrationбув з Півдня. makemigrationsє його заміна.
Крейг Лабенц

2
Це все ще діє. Але це змінилося наmakemigrations --empty
Іулій Керт

2

Була така ж проблема. Переконайтеся, що б класи, які ви визначили в models.py, вам доведеться успадковувати моделі. Клас Модель.

class Product(models.Model):
    title = models.TextField()
    description = models.TextField()
    price = models.TextField()

1

У мене була така ж проблема з тим, що потрібно двічі запускати макеміграції та всіляку дивну поведінку. Виявилося, що корінь проблеми полягав у тому, що я використовував функцію для встановлення дат за замовчуванням у своїх моделях, щоб міграції виявляли зміни щоразу, коли я запускав макеміграції. Відповідь на це питання поставила мене на правильний шлях: Уникайте макеміграцій, щоб заново створити поле дати


1

Нещодавно я модернізував Django з 1.6 до 1.8 і мав декілька додатків та міграцій для них. Я використовував південь і schemamigrationsдля створення міграцій у Django 1.6, який випадає у Django 1.8.

Коли я додав нові моделі після оновлення, makemigrationsкоманда не виявила жодних змін. І тоді я спробував рішення, запропоноване @drojf (перша відповідь), воно спрацювало чудово, але не вдалося застосувати підроблену початкову міграцію ( python manage.py --fake-initial). Я робив це так, як вже були створені мої таблиці (старі таблиці).

Нарешті, це працювало для мене, видалив нові моделі (або зміни моделі) з models.py, а потім довелося видалити (або перейменувати для безпеки резервну копію) папку міграцій із усіх програм та запустити manage.pyпікетон макеміграції для всіх додатків, потім зробив python manage.py migrate --fake-initial. Це спрацювало як шарм. Після створення первинної міграції для всіх програм та підробленої початкової міграції, потім додаються нові моделі та дотримуються регулярних процесів makemigrationsта міграції цього додатка. Зміни було виявлено зараз, і все пішло нормально.

Я просто думав поділитися цим тут, якщо хтось стикається з тією ж проблемою (маючи schemamigrationsпівдень для своїх додатків), це може їм допомогти :)


1

Можливо, це може комусь допомогти, у мене була така ж проблема.

Я вже створив дві таблиці з класом серіалізатора та поданнями. Тому коли я хотів оновити, у мене виникла ця помилка.

Я дотримувався цих кроків:

  1. я зробив .\manage.py makemigrations app
  2. Я стратив .\manage.py migrate
  3. Я стерв обидві таблиці моїх models.py
  4. Я видалив усі посилання на свої таблиці з серіалізатора та класу перегляду.
  5. Я виконав крок 1і 2.
  6. Я змінив свої зміни просто в models.py
  7. Я знову виконав крок 5.
  8. Я відновив усі свої зміни.

Якщо ви працюєте з Pycharm, краєзнавство дуже корисно.


1

Можливо, це комусь допоможе.

Я видалив свої models.pyі очікував makemigrationsна створення DeleteModelзаяв.

Не забудьте видалити *.pycфайли!


1
./manage makemigrations
./manage migrate

Міграції відстежують зміни в БД, тому якщо ви переходите від некерованого до керованого, вам потрібно переконатися, що таблиця бази даних є актуальною стосовно моделі, з якою ви маєте справу.

Якщо ви все ще перебуваєте в режимі розробки, я особисто вирішив видалити файли міграції в моєму IDE, а також у таблиці django_migrations, що стосується моєї моделі, і повторно вказану команду.

ПАМ'ЯТАЙТЕ: якщо у вашій базі даних є міграція, яка закінчується _001 у вашому IDE та _003. Django побачить лише якщо у вас є міграція, що закінчується _004, для чого-небудь оновлення.

2 (міграція коду та db) пов'язані між собою та працюють у тандемі.

Щасливе кодування.


1
  1. Видаліть зміни, які потрібно синхронізувати.
  2. Запустіть python Manag.py makemigrations app_label для початкової міграції.
  3. Запустіть python Manag.py migrate для створення таблиць перед тим, як внести зміни.
  4. Вставте зміни, які ви видалите на першому кроці.
  5. Виконати 2. і 3. кроки

0

Додав цю відповідь, тому що ніхто з інших доступних вище для мене не працював.

У моєму випадку сталося щось ще дивніше ( версія Django 1.7 ). У моєму models.py в кінці файлу був "додатковий" рядок (це був порожній рядок), і коли я виконував python manage.py makemigrationsкоманду, результат був таким: "змін не виявлено".

Щоб виправити це, я видалив цей "порожній рядок", який був наприкінці мого файлу models.py, і я знову запустив команду, все було виправлено, і всі зміни, внесені до models.py, були виявлені!


Ну а в джанго 2.0 + цей порожній рядок потрібен, я вірю, я повинен був зробити протилежне тому, що ти зробив приятелю
Суміт Кумар Саха

@SumitKumarSaha ха-ха, я зараз використовую версію Django 1.7, і цей порожній рядок став причиною двох годин, щоб намагатися вирішити помилку міграції. Дякуємо, що поділилися Sumit. Приємного дня
Huskie

0

Можливо, вам доведеться підробити початкові міграції за допомогою команди нижче

python manage.py migrate --fake-initial

0

По-перше, це рішення застосовне до тих, хто стикається з тією ж проблемою під час розгортання на сервері heroku, у мене виникло те саме питання.

Для розгортання є обов'язковий крок, який повинен додати django_heroku.settings (localals ()) у файл settings.py.

Зміни: Коли я змінив вищезазначений рядок на django_heroku.settings (locals (), бази даних = False), він працював бездоганно.


0

У моєму випадку мені потрібно було додати свою модель до файлу _ init _.py папки моделей, де була визначена моя модель:

from myapp.models.mymodel import MyModel

-1

Додаю 2c, оскільки жодне з цих рішень не працювало на мене, але це зробило ...

Я щойно запустив manage.py squashmigrationsі видалив старі міграції (і файли, і рядки в таблиці бази даних django.migrations).

Це залишило такий рядок у останньому файлі міграції:

replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]

Це, мабуть, заплутало Джанго і спричинило дивну поведінку: біг manage.py makemigrations my_appвідтворить початкову міграцію так, як ніби не існує. Видалення replaces...рядка вирішило проблему!


-1

python Manag.py акаунти макеміграції Міграції для 'акаунтів': акаунти \ міграції \ 0001_initial.py - Створення моделі клієнта - Створення моделі тегу - Створення моделі продукту - Створення моделі замовлення

Примітка: тут "акаунти" - це моє ім'я програми

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