Получение ошибки миграции 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
.