【发布时间】:2022-01-18 19:57:44
【问题描述】:
我正在尝试在 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?
这发生在本地和我的生产机器上。
以下是相关迁移的内容:
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('intake', '0020_alter_client_status'),
]
operations = [
migrations.AlterField(
model_name='byattorney',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='client',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='client',
name='status',
field=models.CharField(choices=[('1__intake', 'Stage 1: Needs initial contact'), ('2__attorney-review', 'Stage 2: Needs attorney contact'), ('3__evaluation', 'Stage 3: Evaluation - Accept/Reject'), ('4__final-disposition', 'Stage 4: Final Disposition'), ('5__client-accepted', 'Client Accepted'), ('6__client-rejected', 'Client Rejected')], max_length=20),
),
]
这里是`python manage.py sqlmigrate carry 0021'的输出:
python manage.py sqlmigrate intake 0021
BEGIN;
--
-- Alter field id on byattorney
--
SET CONSTRAINTS "intake_client_by_attorney_id_680583a2_fk" IMMEDIATE; ALTER TABLE "intake_client" DROP CONSTRAINT "intake_client_by_attorney_id_680583a2_fk";
ALTER TABLE "intake_byattorney" ALTER COLUMN "id" TYPE integer USING "id"::integer;
DROP SEQUENCE IF EXISTS "intake_byattorney_id_seq" CASCADE;
CREATE SEQUENCE "intake_byattorney_id_seq";
ALTER TABLE "intake_byattorney" ALTER COLUMN "id" SET DEFAULT nextval('"intake_byattorney_id_seq"');
SELECT setval('"intake_byattorney_id_seq"', MAX("id")) FROM "intake_byattorney";
ALTER SEQUENCE "intake_byattorney_id_seq" OWNED BY "intake_byattorney"."id";
ALTER TABLE "intake_client" ALTER COLUMN "by_attorney_id" TYPE integer USING "by_attorney_id"::integer;
ALTER TABLE "intake_client" ADD CONSTRAINT "intake_client_by_attorney_id_680583a2_fk" FOREIGN KEY ("by_attorney_id") REFERENCES "intake_byattorney" ("id") DEFERRABLE INITIALLY DEFERRED;
--
-- Alter field id on client
--
ALTER TABLE "intake_client" ALTER COLUMN "id" TYPE integer USING "id"::integer;
DROP SEQUENCE IF EXISTS "intake_client_id_seq" CASCADE;
CREATE SEQUENCE "intake_client_id_seq";
ALTER TABLE "intake_client" ALTER COLUMN "id" SET DEFAULT nextval('"intake_client_id_seq"');
SELECT setval('"intake_client_id_seq"', MAX("id")) FROM "intake_client";
ALTER SEQUENCE "intake_client_id_seq" OWNED BY "intake_client"."id";
--
-- Alter field status on client
--
COMMIT;
【问题讨论】:
-
能分享一下迁移文件
intake.0021_auto_20220115_1147的内容吗? -
@IainShelvington:感谢您的建议。我已编辑问题以包含迁移的内容。
-
看起来迁移正在改变您的几个
id字段,这是预期的,您改变了什么?您能否运行python manage.py sqlmigrate intake 0021并将输出添加到问题中,您可以了解 Django 正在尝试运行的实际 SQL。您最近是否更改了数据库设置? -
谢谢,不知道那个。我将它添加到问题中。我确实认为这很奇怪,前两个迁移变化;我没有看到相应的代码更改来解释它们。第三个反映了我正在尝试做的事情,即使状态可以按任意顺序而不是按字母顺序排序。是否可以编辑或跳过迁移,还是我只是自找麻烦?
-
您可以删除
id字段的这两个 AlterField 操作,因此迁移只是您实际想要进行的更改并应用它。然后为id更改创建一个单独的迁移并运行python manage.py migrate intake --fake以将新迁移标记为已应用但不实际运行它。
标签: python django django-models django-migrations