Изменение первичного ключа с 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
- sudo su postgres
- drop database database_name
- psql livedx_qa < /home/Documents/database_name.sql <- снова сброс БД
python3 manage.py makemigrations
python3 manage.py migrate
Я тоже столкнулся с этой проблемой, вы можете использовать это решение. Вы не можете удалять файлы миграций вручную, это неправильный способ, поэтому !!!!!
Спасибо!!!