Django: повторяющееся значение ключа нарушает уникальное ограничение с помощью Postgresql, а не с SQlite -> почему? - PullRequest
0 голосов
/ 27 мая 2020

Я только что развернул свой проект с базой данных Postgresql и получил сообщение об ошибке, которое нарушает уникальное ограничение, которого у меня не было с моей базой данных разработки sqlite уникальное ограничение "adm_bra_pkey" ПОДРОБНЕЕ: Ключ (bra_ide) = (1) уже существует.

У меня есть таблица (adm_bra), предварительно заполненная двумя строками.

Я пытаюсь ВСТАВИТЬ новый строки с кодом с использованием методов models.objects.create () в представлении.

Почему это происходит с postgresql, а не с базой данных sqlite? Я пытаюсь УДАЛИТЬ и ПЕРЕЗАПУСТИТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ для adm_bra, но это не работает!

спасибо за помощь

EDIT Сначала я провел несколько тестов Я повторно инициализировал свою таблицу

DELETE FROM adm_bra;
ALTER SEQUENCE adm_pro_pro_ide_seq RESTART WITH 1;
INSERT INTO adm_bra ("bra_ide","ran_st1","ran_st2","bra_00A_act","bra_00A_lib","bra_00B_act","bra_00B_lib","bra_00C_act","bra_00C_lib","bra_00D_act","bra_00D_lib","bra_log","bra_dat","pay_ide_id") 
VALUES (1,1,1,1,'HCQ+LPV/r',1,'HCQ+DRV/r',1,'LPV/r+TMS',1,'LPV/r+ATS','admin',now(),1);
INSERT INTO adm_bra ("bra_ide","ran_st1","ran_st2","bra_00A_act","bra_00A_lib","bra_00B_act","bra_00B_lib","bra_00C_act","bra_00C_lib","bra_00D_act","bra_00D_lib","bra_log","bra_dat","pay_ide_id") 
VALUES (2,2,1,1,'HCQ+LPV/r',1,'HCQ+DRV/r',1,'LPV/r+TMS',1,'LPV/r+ATS','admin',now(),1);

Я получаю уникальную ошибку ограничения, если пытаюсь выполнить этот код:

Bras.objects.create(
                ran_st1 = 1, 
                ran_st2 = 1,
                bra_00A_act = 1, 
                bra_00A_lib = 'HCQ+LPV/r', 
                bra_00B_act = 1, 
                bra_00B_lib = 'HCQ+DRV/r', 
                bra_00C_act = 1, 
                bra_00C_lib = 'LPV/r+TMS', 
                bra_00D_act = None, 
                bra_00D_lib = None, 
                bra_00E_act = None, 
                bra_00E_lib = None, 
                bra_00F_act = None, 
                bra_00F_lib = None, 
                bra_00G_act = None, 
                bra_00G_lib = None, 
                bra_00H_act = None, 
                bra_00H_lib = None, 
                bra_00I_act = None, 
                bra_00I_lib = None, 
                bra_00J_act = None, 
                bra_00J_lib = None, 
                bra_dat = timezone.now(), 
                bra_log = 'admin', 
                pay_ide_id = 2
            )

Но если выполнить этот код, он работает:

b= Bras(           ran_st1 = 1,ran_st2 = 1,
                bra_00A_act = 1,
                bra_00A_lib = 'HCQ+LPV/r', 
                bra_00B_act = 1,
                bra_00B_lib = 'HCQ+DRV/r', 
                bra_00C_act = 1, 
                bra_00C_lib = 'LPV/r+TMS', 
                bra_00D_act = None, 
                bra_00D_lib = None, 
                bra_00E_act = None, 
                bra_00E_lib = None, 
                bra_00F_act = None, 
                bra_00F_lib = None, 
                bra_00G_act = None, 
                bra_00G_lib = None, 
                bra_00H_act = None, 
                bra_00H_lib = None, 
                bra_00I_act = None, 
                bra_00I_lib = None, 
                bra_00J_act = None, 
                bra_00J_lib = None, 
                bra_dat = timezone.now(), 
                bra_log = 'admin', 
                pay_ide_id = 2
            )
b.save()
Bras.objects.create(
                ran_st1 = 1, 
                ran_st2 = 1,
                bra_00A_act = 1, 
                bra_00A_lib = 'HCQ+LPV/r', 
                bra_00B_act = 1, 
                bra_00B_lib = 'HCQ+DRV/r', 
                bra_00C_act = 1, 
                bra_00C_lib = 'LPV/r+TMS', 
                bra_00D_act = None, 
                bra_00D_lib = None, 
                bra_00E_act = None, 
                bra_00E_lib = None, 
                bra_00F_act = None, 
                bra_00F_lib = None, 
                bra_00G_act = None, 
                bra_00G_lib = None, 
                bra_00H_act = None, 
                bra_00H_lib = None, 
                bra_00I_act = None, 
                bra_00I_lib = None, 
                bra_00J_act = None, 
                bra_00J_lib = None, 
                bra_dat = timezone.now(), 
                bra_log = 'admin', 
                pay_ide_id = 2
            )

1 Ответ

1 голос
/ 27 мая 2020

На самом деле вы перезапускаете последовательность с 1, а затем в своем запросе вы вручную передаете значение bra_ide. Таким образом, когда вы выполняете эти запросы, последовательность не используется для создания столбца по умолчанию. Когда вы пытаетесь вставить, последовательность предоставляет значение 1, так как она запускается впервые и вы получаете ошибку целостности.

При выполнении запросов удалите столбец bra_ide и его значения. Таким образом, ваша последовательность будет генерировать значения автоматически.

...