Импорт данных с вручную установленными идентификаторами в базу данных Postgres - PullRequest
0 голосов
/ 09 октября 2018

Недавно я написал скрипт экспорта, который обновляет мою базу данных из данных JSON.Я хотел сохранить свои старые идентификаторы и столкнулся с двумя проблемами:

1) Postgres отслеживает последние вставленные идентификаторы, даже когда таблица была удалена или усечена 2) При установке идентификатора вручную для объекта сМетод setId (), он будет просто проигнорирован и использует следующий доступный идентификатор

Вот решение, которое я придумал, я решил поделиться им

1 Ответ

0 голосов
/ 09 октября 2018
<?php

// Deleting old datas
foreach ($oldEntities as $entity) {
    $em->remove($entity);
}

$em->flush();

// Fetching the table name from the entity class
$tableName = $em->getClassMetadata(YourEntity::class)->getTableName();
// Resetting table ids sequence to 1
$em->getConnection()->exec('ALTER SEQUENCE ' . $tableName . '_id_seq RESTART WITH 1');

// Disabling auto-increment for the table
// This is necessary because otherwise a manually set id will be ignored
$metadata = $em->getClassMetaData(YourEntity::class);
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());

// Importing your datas
foreach ($exportedJSONdatas as $row) {
    $entity = new YourEntity();

    $entity
        ->setId($row->id)
        ->setTitle($row->title)
        // ... set whatever else you want
    ;

    $em->persist($entity);
}

$em->flush();

// Setting the id that will be used when new data is persisted
// Otherwise Postgres will try to insert with id 1 and fail
$em->getConnection()->exec(
    'SELECT SETVAL(
        \'' . $tableName . '_id_seq\', 
        (SELECT MAX(id) + 1 FROM ' . $tableName . ')
    )'
);

// You're good to go, new persisted entities will continue with the right id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...