Django ошибка при миграции

I find Django migrations a bit of a mystery, and tend to prefer external tools (liquibase, for example).

However, I just ran into this «No migrations to apply» problem as well. I also tried removing the migrations folder, which doesn’t help.

If you’ve already removed the migrations folder, here’s an approach that worked for me.

First, generate the new «clean» migrations:

$ python manage.py makemigrations foo
Migrations for 'foo':
  dashboard/foo/migrations/0001_initial.py
    - Create model Foo
    - Create model Bar

Then look at the SQL and see if it looks reasonable:

$ python manage.py sqlmigrate foo 0001
BEGIN;
--
-- Create model Foo
--
CREATE TABLE "foo" ("id" serial NOT NULL PRIMARY KEY, ... "created_at" timestamp with time zone NOT NULL, "updated_at" timestamp with time zone NOT NULL);
CREATE INDEX "..." ON "foo" (...);
COMMIT;

Then apply execute that same SQL on your database.

I’m using Postgres but it will be similar for other engines.

One way is to write the content to a file:

$ python manage.py sqlmigrate foo 0001 > foo.sql
$ psql dbname username < foo.sql
BEGIN
CREATE TABLE
CREATE INDEX
COMMIT

Another is pipe the SQL directly:

$ python manage.py sqlmigrate foo 0001 | psql dbname username

Or copy and paste it, etc.

Добавил в модель три необязательных поля, но manage.py makemigrations создаёт миграции типа CreateTable (последних трёх полей в таблице нет, ) вместо AlterTable или AlterField:

migrations.CreateModel(
            name='InviteBonus',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ('total', models.DecimalField(verbose_name='u0421u0443u043cu043cu0430 u043fu043bu0430u0442u0435u0436u0430', max_digits=12, decimal_places=2)),
                ('use_date', models.DateField(verbose_name='u0414u0430u0442u0430 u043fu043bu0430u0442u0435u0436u0430')),
                ('line', models.PositiveIntegerField(null=True, verbose_name='u043bu0438u043du0438u044f', blank=True)),
                ('paid', models.BooleanField(default=False, verbose_name='u0412u044bu043fu043bu0430u0447u0435u043du043e')),
                ('five_per_period', models.BooleanField(default=False, verbose_name='u043fu044fu0442u044c u0437u0430 u043fu0435u0440u0438u043eu0434')),
                ('comment', models.CharField(max_length=100, verbose_name='u041au043eu043cu043cu0435u043du0442u0430u0440u0438u0439')),
                ('inviter', models.ForeignKey(related_name='invite_bonuses', default=None, verbose_name='u0423u0447u0430u0441u0442u043du0438u043a', to='accounts.TreeNode')),
                ('newbie', models.ForeignKey(related_name='awards', verbose_name='u043fu0440u0438u0433u043bu0430u0448u0451u043du043du044bu0439', blank=True, to='accounts.TreeNode', null=True)),
            ],
            options={
                'db_table': 'invite_bonuses',
                'verbose_name': 'u0432u044bu043fu043bu0430u0442u0430 u043au043bu0438u0435u043du0442u0443 u0437u0430 u043fu0440u0438u0433u043bu0430u0448u0435u043du0438u0435',
                'verbose_name_plural': 'u0432u044bu043fu043bu0430u0442u044b u043au043bu0438u0435u043du0442u0430u043c u0437u0430 u043fu0440u0438u0433u043bu0430u0448u0435u043du0438u044f',
            },
            bases=(models.Model,),
        ),

Что я делал:
— Удалял папку migrations
— Чистил таблицу django_migrations

Затем запускал

manage.py makemigrations
	manage.py migrate - FAKED, потому что таблица уже есть, поэтому нужно делать добавление полей вместо создания таблицы
	manage.py syncdb - Тоже ни о чём

I have a problem (at least I think). I am new in all this, so I apologize If I ask something stupid.
I have some site, which is working normally. When I try to make migrations ( python manage.py makemigrations), everything passed ok, I got the message of how many models new I have, etc. But, when I run after that migrate, I got the following output:

Operations to perform:
  Apply all migrations: admin, auth, comments, contenttypes, news, sessions
  Running migrations:
   Applying comments.0003_auto_20180816_2158...Traceback (most recent call last):
   File "../venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
  return self.cursor.execute(sql, params)
  psycopg2.ProgrammingError: syntax error at or near "WITH ORDINALITY"
  LINE 6:                     FROM unnest(c.conkey) WITH ORDINALITY co...
                                              ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
   execute_from_command_line(sys.argv)
  File ".../venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
 File ".../venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File ".../venv/lib/python3.6/site-packages/django/core/management/base.py", line 316, in run_from_argv
self.execute(*args, **cmd_options)
File 
  ".../venv/lib/python3.6/site-packages/django/core/management/base.py", line 353, in execute
   output = self.handle(*args, **options)
  File 
".../venv/lib/python3.6/site-packages/django/core/management/base.py", line 83, in wrapped
     res = handle_func(*args, **kwargs)
   File ".../venv/lib/python3.6/site- 
 packages/django/core/management/commands/migrate.py", line 203, in handle
fake_initial=fake_initial,
   File 


 ".../venv/lib/python3.6/site- 
packages/django/db/backends/base/schema.py", line 531, in _alter_field
fk_names = self._constraint_names(model, [old_field.column], 
foreign_key=True)
  File ".../venv/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 1027, in _constraint_names
constraints = self.connection.introspection.get_constraints(cursor, model._meta.db_table)
 File ".../venv/lib/python3.6/site- 
packages/django/db/backends/postgresql/introspection.py", line 158, in get_constraints
""", ["public", table_name])
 File ".../venv/lib/python3.6/site-packages/django/db/backends/utils.py", 
 line 100, in execute
   return super().execute(sql, params)
 File 


".../venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 68, in execute
   return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File ".../venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
return executor(sql, params, many, context)
  File ".../venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
  File "/.../venv/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
  File ".../venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
  return self.cursor.execute(sql, params)
 django.db.utils.ProgrammingError: syntax error at or near "WITH 
ORDINALITY"
LINE 6:                     FROM unnest(c.conkey) WITH ORDINALITY co...
                                              ^

Anyway, if after that I try again to make migrations, got the message that I don’t have migrations. So, Django did the job, But this error is here constantly when I try to migrate, I am really wondering why. I tried to google it, but I got nothing.


Ситуация: ты пытаешься выполнить миграции в Django. Но появляется ошибка «no changes detected» и ничего не происходит. Как исправить ошибку и провести миграцию?

No Changes Detected: ошибка миграции в Django

Как правило, эта ошибка возникает после попытки «перекроить» базу данных. Например, ты решил, что имеющаяся база данных, ее структура требует изменений. Скажем, нужно убрать лишние поля. Быстрый и простой способ — полностью «перекомпоновать», пересоздать базу данных.

Для этого удаляется база данных и файлы миграции. Соответственно, это «костыльный» способ. Так как при этом удаляются все записи. На этапе разработки сайта или учебного проекта это возможно. На реальном сайте маловероятно — так как удаляется весь контент.

👉 При удалении файлов миграции можно допустить ошибку — удалить файл «__init__.py«. Дело в том, что для Django папка «migrations» воспринимается как приложение. И файл «__init__.py» является обязательным. Без него и возникает ошибка «no changes detected».

No Changes Detected: ошибка миграции в Django

Проверяем, есть ли на месте этот файл. Если нет, то просто создаем его. Заметь — в названии используются двойные нижние подчеркивания. Сам файл оставляем пустым.

📢 Другие причины ошибки no changes detected

Твое приложение обязательно должно быть добавлено в INSTALLED_APPS файла «settings.py»:

Также проверяем наличие файла «__init__.py» в папке твоего приложения (где у тебя лежит файл «views.py» с представлениями, статические фалы и сама папка «migrations»).

В файле «models.py» классы должны наследоваться от «django.db.models.Model». В «models.py» должен быть соответствующий импорт, а в самом классе соответствующая запись в круглых скобках.

Проверяем, нет ли семантических ошибок в «models.py».

Также возможны ошибки при настройках Git. В частности в файле «.gitignore».


Поделиться в соц сетях

Как исправить миграцию

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

Если вы меняли модель данных, ошиблись, но уже успели запустить makemigrations, то ситуация делится на 2 случая: если вы уже запустили migrate с этой миграцией и если вы ещё этого не сделали.

Если ещё не запустили migrate

В таком случае, миграция появилась только как файл в папке migrations/. Найдите файл этой миграции (скорее всего, он будет последним по номеру), и удалите его.

После этого возвращайтесь к переписыванию моделей, как будто ничего небыло. Новый вызов makemigrations создаст новую миграцию взамен старой.

Если вы уже запустили migrate

В таком случае миграция уже попала в базу данных, и извлечь её сложнее. Самый простой и варварский способ — это удалить файл последней миграции, как в предыдущем случае, а потом вдобавок удалить и базу данных (обычно это файл db.sqlite3 в корне проекта).

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

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

Если вы дорожите базой данных

Вот неплохой ответ на StackOverflow как отменить миграцию. Там же вы найдёте много других полезных советов. Этот вариант не для новичков, так что аккуратней с ним. Если вы используете тестовую базу данных, в которой нет ничего важного — проще воспользоваться предыдущим советом и удалить базу данных.

Что читать дальше

Если у вас ошибка You are trying to add a non-nullable field without a default, то вот статья как её исправить.


Попробуйте бесплатные уроки по Python

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

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.

Набор на курс до мидла

Набор на курс до мидла

  • Django rest framework обработка ошибок
  • Divinity original sin ошибка msvcp120 dll
  • Django is not importable in this environment ошибка
  • Divinity original sin ошибка msvcp110
  • Django admin ошибка проверки csrf запрос отклонен