Изменение первичного ключа с username на uuid в POSTGREQL дает: django.db.utils.ProgrammingError: колонка "username" находится в первичном ключе

У меня есть база данных postgresql, и я делаю миграцию, чтобы переключить мой pk с имени пользователя на uuid.

Я уже сделал файл миграции данных, где я добавляю uuid к каждой строке в моей модели. Он отлично работает на sqlite, но когда я тестировал его на postgresql, я получил ошибку.

Ошибка была "django.db.utils.ProgrammingError: column "username" is in a primary key"

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

# models.py
class UserInformation(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=False)
    username = models.CharField(max_length=100, unique=True, blank=True, null=True)
# data migration 42
import uuid

from django.db import migrations


def set_uuid_for_all_user_information(apps, schema_editor):
    UserInformation = apps.get_model('accounts', 'UserInformation')

    for userInformation_user in UserInformation.objects.all():
        userInformation_user.uuid = uuid.uuid4().hex
        userInformation_user.save()


class Migration(migrations.Migration):
    dependencies = [
        ('accounts', '0041_auto_20211227_2113'),
    ]

    operations = [
        migrations.RunPython(set_uuid_for_all_user_information),
    ]
# migration 43 (this is where the postgresqsl error occurs) trying to change pk from username to uuid

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid


class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('accounts', '0042_auto_20211229_2319'),
    ]

    operations = [
        migrations.AlterField(
            model_name='userinformation',
            name='user',
            field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='auth.user'),
        ),
        migrations.AlterField(
            model_name='userinformation',
            name='username',
            field=models.CharField(blank=True, max_length=100, null=True, unique=True),
        ),
        migrations.AlterField(
            model_name='userinformation',
            name='uuid',
            field=models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False),
        ),
    ]

При запуске python manage.py migrate я получаю эту ошибку:

Я думал решить это с помощью raw SQL в базе данных, но не был уверен, вызовет ли это дальнейшие проблемы или нет. Я бы предпочел исправить это с помощью django, а не raw sql

Привет Август Цезарь,

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

для резервного копирования. pg_dumpall -U postgres > c:\pgbackup\all.sql

  1. sudo su postgres
  2. drop database database_name
  3. psql livedx_qa < /home/Documents/database_name.sql <- снова сброс БД

python3 manage.py makemigrations

python3 manage.py migrate

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

Спасибо!!!

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