Я работаю над проектом в symfony 4, а база данных находится в postgresql. Существует два метода обновления базы данных:
Способ 1. через скрипт Python с простыми вставками sql
Способ 2. через формы symfony
Оба этих метода пишут в одну и ту же таблицу.
Сценарий А:
Способ 2. добавляет строку в таблицу, используя форму symfony (pid - 1)
Метод 1. использует скрипт Python для добавления 500 строк (последовательность pid достигает 501)
Способ 2. Другой пользователь пытается добавить строку, а доктрина пытается вставить с pid = 2, но это должно быть «502».
Я пытался использовать GeneratedValue(strategy="AUTO") и "IDENTITY" в определении объекта, но это не решает проблему
/* Определение класса объекта для поля */
/**
* @ORM\Id()
* @ORM\GeneratedValue
* @ORM\Column(type = "integer")
*/
private $id;
/* Обработчик отправки формы */
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$data =$form->getData();
$property = new Property();
$property->setTitle($data['title']);
$property->setDescription($data['description']);
$property->setPrice($data['price']);
$em->persist($property);
$em->flush();
return $this->redirectToRoute('property');
}
Возможные решения
Определите поле в классе сущностей таким образом, чтобы оно автоматически получало следующее значение auto_increment
Получите следующее значение auto_increment перед вставкой из формы
Замените postgresql на mysql (если это поможет)
Замените auto_increment на UUID
Пожалуйста, предложите, какое решение лучше всего использовать, если оно существует
@ ŁukaszKamiński Я пробовал это, и это все еще не решает проблему. Сценарий обновляет базу данных раз в два дня, и форма доступна в любое время. Таким образом, сценарий и форма также должны обновляться одновременно. Сценарий добавляет около 1000 строк каждый раз, когда он запускается.






Глядя на ваш класс сущностей, я думаю, что объявление не завершено для установки автоматического значения для идентификатора из таблицы последовательности. Вместо этого попробуйте это объявление. Это сработало для меня
/**
* @ORM\Id()
* @ORM\Column(type = "integer", options = {"default" = "nextval('property_id_seq'::regclass)"})
* @ORM\GeneratedValue(strategy = "SEQUENCE")
*/
private $id;Удалите существующую таблицу и обновите схему из корзины/консоли.
AUTO должен использовать последовательности PostgreSQL, и это на стороне сервера. Я не понимаю, как вы могли по-прежнему получать конфликты, используя эту стратегию. Может попробовать заставить
@GeneratedValue(strategy = "SEQUENCE"). Обратите внимание, что по умолчанию Doctrine создает последовательность, которая увеличивается на 10, поэтому у вас будут большие промежутки со вставками, выполненными клиентами, отличными от Doctrine.