Получение ошибки миграции Django "sequence must have same owner as table it is linked to", но все таблицы и последовательности имеют одного владельца

Я пытаюсь запустить миграцию в проекте Django. (Django 3.1, Python 3.9.9) Я нахожусь в своей виртуальной среде. Я продолжаю получать загадочную ошибку.

 python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, intake, sessions
Running migrations:
  Applying intake.0021_auto_20220115_1147...Traceback (most recent call last):
  File "/Users/me/Sites/client/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.ObjectNotInPrerequisiteState: sequence must have same owner as table it is linked to

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

intake=# \dt
                    List of relations
 Schema |            Name            | Type  |   Owner   
--------+----------------------------+-------+-----------
 public | auth_group                 | table | dbuser
 public | auth_group_permissions     | table | dbuser
 public | auth_permission            | table | dbuser
 public | auth_user                  | table | dbuser
 public | auth_user_groups           | table | dbuser
 public | auth_user_user_permissions | table | dbuser
 public | django_admin_log           | table | dbuser
 public | django_content_type        | table | dbuser
 public | django_migrations          | table | dbuser
 public | django_session             | table | dbuser
 public | intake_byattorney          | table | dbuser
 public | intake_client              | table | dbuser
(12 rows)

intake=# \ds
                         List of relations
 Schema |               Name                |   Type   |   Owner   
--------+-----------------------------------+----------+-----------
 public | auth_group_id_seq                 | sequence | dbuser
 public | auth_group_permissions_id_seq     | sequence | dbuser
 public | auth_permission_id_seq            | sequence | dbuser
 public | auth_user_groups_id_seq           | sequence | dbuser
 public | auth_user_id_seq                  | sequence | dbuser
 public | auth_user_user_permissions_id_seq | sequence | dbuser
 public | django_admin_log_id_seq           | sequence | dbuser
 public | django_content_type_id_seq        | sequence | dbuser
 public | django_migrations_id_seq          | sequence | dbuser
 public | intake_byattorney_id_seq          | sequence | dbuser
 public | intake_client_id_seq              | sequence | dbuser
(11 rows)

Почему это может быть? Нужно ли мне изменить права собственности на таблицы и последовательности на что-то другое, например postgres?

Это происходит локально и на моей рабочей машине.

У меня была точно такая же проблема с моим проектом после makemigrations на id как BigAutoField. Оказывается, эта ошибка SQL вызвана предыдущей проблемой. Если вы запустите ./manage.py showmigrations, в нем должно быть указано, что миграция приема 0021 не выполнена.

intake
 [X] 0001_initial
 [X] 0002_auto_20220214_1030
 [X] ...
 [ ] intake.0021_auto_20220115_1147

Однако в таблице django_migrations в вашей БД должна быть указана эта intake.0021 миграция. Это означает, что она уже применена.

SELECT name FROM django_migrations WHERE app = 'intake' AND starts_with(name, '0021');

Но, указанное имя БД может немного отличаться от имени существующего файла: 0021_auto_20220115_1147 (run @ 11:47). например, в DB: 0021_auto_20220115_1056 (run @ 10:56). Это может быть вызвано тем, что makemigrations выполняется на другом сервере, а не на том, который используется в настоящее время (dev).

Измените имя файла в соответствии с тем, что у вас есть в django_migrations в БД и запустите manage.py migrate снова, и он должен работать.

Ошибка вызвана оператором ALTER SEQUENCE.

ALTER SEQUENCE "intake_byattorney_id_seq" OWNED BY "intake_byattorney"."id";
ALTER SEQUENCE "intake_client_id_seq" OWNED BY "intake_client"."id";

В postgres первичный ключ AutoField управляется последовательностью. Почему django не использует синтаксис ALTER SEQUENCE seq_name as bigint вместо DROP - CREATE? Я не знаю, но CREATE SEQUENCE, сделанный manage.py, присваивает последовательности postgres OWNER, и это источник проблемы, потому что таблица.столбец, с которым связана последовательность, имеет dbuser OWNER.

Поэтому выполнение оператора ALTER SEQUENCE OWNED BY, желающего связать вновь созданную последовательность с соответствующей таблицей.столбцом с другим OWNER, вызывает ошибку sequence must have same owner as table it is linked to.

Вернуться на верх