Django 1.7-makemigrations не обнаруживает изменений
как говорится в названии, я не могу заставить миграции работать.
приложение изначально было под 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, если это вообще помогает.
23 ответа:
Если вы переходите от существующего приложения, которое вы сделали в django 1.6, то вам нужно сделать один предварительный шаг (как я узнал), указанный в документации:
python manage.py сделать эмиграцию your_app_label
документация не делает очевидным, что вам нужно добавить ярлык приложения в команду, так как первое, что он говорит вам сделать, это
python manage.py makemigrations
что не сумеет. Начальная миграция выполняется при создании приложения в версия 1.7, но если вы пришли из 1.6 не проводились. Смотрите 'добавление миграции в приложения' в документации для более подробной информации.
ОК, похоже, я пропустил очевидный шаг, но публикую это на случай, если кто-то еще сделает то же самое.
при обновлении до 1.7, мои модели стали неуправляемые (
managed = False
) - У меня они были какTrue
раньше, но, кажется,он вернулся.удаление этой строки (по умолчанию True), а затем запуск
makemigrations
сразу же сделал модуль миграции, и теперь он работает.makemigrations
не будет работать на неуправляемых таблицах (что очевидно задним числом)
мое решение не было охвачено здесь, поэтому я публикую его. Я использовал
syncdb
для проекта–просто, чтобы получить его и работает. Затем, когда я попытался начать использовать миграции Django, он сначала подделал их, а затем сказал бы, что все в порядке, но с базой данных ничего не происходит.мое решение было просто удалить все файлы миграции для моего приложения, а также как записи базы данных для миграции приложения в
django_migrations
таблица.тогда я просто сделал начальная миграция с помощью:
./manage.py makemigrations my_app
затем:
./manage.py migrate my_app
теперь я могу сделать миграции без проблем.
это может произойти по следующим причинам:
- вы не добавили приложение в
INSTALLED_APPS
в списокsettings.py
(Вы должны добавить название или пунктирный путь к подклассу AppConfig в apps.py в папке приложения, в зависимости от версии django, которую вы используете). См. документацию: INSTALLED_APPS- нет
migrations
внутри приложения. (Решение: просто создайте эту папку).- нет
__init__.py
внутриmigrations
папка этих приложений. (Решение: просто создайте пустой файл с именем __init__.py)- у тебя нет
__init__.py
файл в папке приложения. (Решение: просто создайте пустой файл с именем __init__.py)- у тебя нет
models.py
в приложение- ваш класс Python (должен быть моделью) в
models.py
не наследуетdjango.db.models.Model
- у вас есть некоторая семантическая ошибка в определении моделей в
models.py
Примечание: Распространенной ошибкой является добавление на . При клонировании из удаленного РЕПО, и/или
__init__.py
файлы будут отсутствовать в местных РЕПО. Это вызывает проблемы.I предложите игнорировать файлы миграции, добавив следующие строки в
.gitignore
file*/migrations/* !*/migrations/__init__.py
согласен с @furins. Если все кажется в порядке, и все же эта проблема возникает, проверьте, есть ли какой-либо метод свойства с тем же названием, Что и атрибут, который вы пытаетесь добавить в класс модели.
- удалить метод с аналогичным названием в качестве атрибута, который вы добавляете.
- manage.py makemigrations my_app
- manage.py миграция my_app
- добавить методы обратно.
Это своего рода глупая ошибка, но наличие дополнительной запятой в конце строки объявления поля в классе модели делает строку не имеющей никакого эффекта.
это происходит, когда вы копируете вставить def. из миграции, которая сама определяется как массив.
хотя, возможно, это поможет кому-то :-)
ответ находится на этом столбе stackoverflow, по cdvv7788 миграции в Django 1.7
Если это первый раз, когда вы обновляете это приложение, вы должны использовать:
manage.py makemigrations myappname как только вы это сделаете, вы можете сделать:
manage.py миграция если у вас было приложение в базе данных, измените его модель и его не обновление изменений на makemigrations вы, вероятно, havent но это еще не все. Измените свою модель обратно на свою оригинальная форма, запустите первая команда (название приложения) и перенести...это фейк. Однажды вы делаете это, чтобы вернуть изменения в свою модель, запустить makemigrations и мигрируйте снова, и это должно работать.
У меня была точно такая же проблема, и все вышеперечисленное отлично работало.
я переместил свое приложение django в cloud9, и по какой-то причине я никогда не поймал начальную миграцию.
может быть, это поможет кому-то. Я использовал вложенное приложение. проект.appname и у меня на самом деле был проект и проект.имя приложения в INSTALLED_APPS. Удаление проекта из INSTALLED_APPS позволило обнаружить изменения.
такие люди, как я, которые не любят миграции, могут использовать шаги ниже.
- удалить изменения, которые вы хотите синхронизировать.
- выполнить
python manage.py makemigrations app_label
для первичной миграции.- выполнить
python manage.py migrate
для создания таблиц перед внесением изменений.- вставить изменения, которые вы удаляете на первом шаге.
- выполнить 2. и 3. лестница.
Если вы перепутали какой-либо из этих шагов, прочитайте файлы миграции. Измените их, чтобы исправить схему или удалить нежелательные файлы, но не забудьте изменить часть зависимостей следующего файла миграции;)
Я надеюсь, это поможет кому-то в будущем.
следующие работал для меня:
- добавить имя приложения settings.py
- использовать 'python manage.py сделать эмиграцию'
- использовать 'python manage.py migrate'
работал для меня: Python 3.4, Django 1.10
вы хотите проверить
settings.py
наINSTALLED_APPS
список и убедитесь, что все приложения с модели, перечисленные здесь.под управлением
makemigrations
в папке проекта означает, что он будет искать, чтобы обновить все таблицы, связанные со всеми приложениями, включенными вsettings.py
для проекта. Как только вы включите его,makemigrations
будет автоматически включать приложение (это экономит много работы, так что вам не придется запускатьmakemigrations app_name
для каждого приложения в вашем/ - сайт проекта).
на всякий случай у вас есть определенное поле, которое не идентифицируется makemigrations: проверьте дважды, если у вас есть свойство с тем же именем.
пример:
field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True) # ... later @property def field(self): pass
свойство будет "перезаписывать" определение поля, поэтому изменения не будут идентифицироваться
makemigrations
добавить этот ответ, потому что только этот метод помог мне.
Я удалил
migrations
папка runmakemigrations
иmigrate
.
Он все еще говорил:нет миграции для применения.пошел к
migrate
папка и открыл последний созданный файл,
прокомментируйте миграцию, которую я хотел (она была обнаружена и введена там)
и бегиmigrate
снова.это в основном редактирование файла миграции вручную.
сделайте это, только если вы понимаете содержимое файла.
убедитесь, что ваша модель не
abstract
. Я действительно сделал эту ошибку, и это заняло некоторое время, поэтому я подумал, что отправлю его.
вы использовали
schemamigration my_app --initial
после переименования старой папки миграции? Попробовать его. Может работать. Если нет-попробуйте воссоздать базу данных и сделать syncdb+migrate. Это сработало для меня...
У меня была такая же проблема с тем, чтобы запустить makemigrations дважды и все виды странного поведения. Оказалось, что корень проблемы заключался в том, что я использовал функцию для установки дат по умолчанию в своих моделях, поэтому миграции обнаруживали изменение каждый раз, когда я запускал makemigrations. Ответ на этот вопрос поставил меня на правильный путь: избегайте makemigrations для повторного создания поля даты
недавно я обновил Django с 1.6 до 1.8 и имел несколько приложений и миграций для них. Я использовал юг и
schemamigrations
для создания миграции в Django 1.6, которая отбрасывается в Django 1.8.когда я добавил новые модели после обновления
makemigrations
команда не обнаружила никаких изменений. И тогда я попробовал решение, предложенное @drojf (1-й ответ), он работал нормально, но не смог применить поддельную первоначальную миграцию (python manage.py --fake-initial
). Я делал это, так как мои таблицы (старые таблицы) уже были создан.наконец-то это сработало для меня, удалили новые модели (или изменения модели) из models.py а затем пришлось удалить (или переименовать для резервного копирования безопасности) папку миграции всех приложений и запустить python
manage.py
makemigrations для всех приложений, а затем сделалpython manage.py migrate --fake-initial
. Это сработало как заклинание. После того, как начальная миграция создается для всех приложений и поддельные первоначальные мигрировали, а затем добавлены новые модели и последовал регулярный процессmakemigrations
и перенести на это приложение. Изменения были обнаружены сейчас и все все прошло нормально.Я просто подумал поделиться им здесь, Если кто-то сталкивается с той же проблемой (имея
schemamigrations
юг для своих приложений), это может помочь им :)
может быть, может помочь кому-то, у меня была та же проблема.
Я уже создал две таблицы с классом сериализатора и представлениями. Поэтому, когда я хотел обновить, у меня была эта ошибка.
я следовал этим шагам:
- я
.\manage.py makemigrations app
- выполнил
.\manage.py migrate
- я стер обе таблицы моего
models.py
- я стер все ссылки на мои таблицы из сериализатора и класса представления.
- я выполнил шаг
1
и2
.- я получил свои изменения только в
models.py
- я снова выполнил шаг
5
.- я восстановил все мои изменения.
если вы работаете с Pycharm, местная история очень полезна.
может быть, это поможет кому-то.
Я удалил мой
models.py
и ожидалосьmakemigrations
создатьDeleteModel
заявления.не забудьте удалить
*.pyc
файлы!
./manage makemigrations ./manage migrate
миграции отслеживают изменения в БД, поэтому, если вы переходите от неуправляемого к управляемому, вам нужно будет убедиться, что таблица базы данных youre обновлена относительно модели, с которой Вы имеете дело.
Если вы все еще находитесь в режиме dev, я лично решил удалить файлы миграции в моей IDE, а также в таблице django_migrations, относящейся к моей модели, и повторно выполнить приведенную выше команду.
помните: если у вас есть миграция, которая заканчивается на _001 в вашей IDE & _003 в вашей базе данных. Django будет видеть только, если у вас есть миграция, заканчивающаяся на _004 для обновления.
2 (миграция кода и БД) связаны и работают в тандеме.
удачи в кодировании.
добавил этот ответ, потому что ни один из других доступных выше не работал для меня.
в моем случае что-то еще более странное происходит ( Версия Django 1.7), в моем models.py у меня был "дополнительные" строка в конце моего файла (это была пустая строка) и когда я выполнил результат: "никаких изменений не обнаружила".
чтобы исправить это, я удалил этот "пустая строка" Это было в конце моего models.py файл и я снова запустил команду, все было исправлено и все изменения, внесенные в models.py были обнаружены!
добавление моего 2c, так как ни одно из этих решений не работало для меня, но это так...
Я только что бежал
manage.py squashmigrations
и удалил старые миграции (как файлы, так и строки в django.таблица базы данных миграций).это оставило такую строку в последнем файле миграции:
replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]
это, по-видимому, смутило Джанго и вызвало странное поведение: running
manage.py makemigrations my_app
воссоздал бы начальную миграцию, как если бы ее не существовало. Удалениеreplaces...
строка исправлена проблема!