Парсинг данных в БД.
Парсинг данных в БД.
Всем привет.
Для заполнении БД данными из файла (xml), делю данные на два массива,
один для insert (новые данные), второй для update (измененные данные, которые уже есть в бд).
Новые данные отслеживаю по некоему идентификатору, если в БД уже такой есть, то данные для обновления,
если нет, то для добавления.
Так вот, при добавлении новых данных в БД проблем нет Yii::$app->db->createCommand()->batchInsert
Подскажите как массово обновить данные по ключам, по типу batchInsert и условию WHERE IN (ключи)?
ЗЫ понятно что можно в цикле простым update сделать, но например у меня 4000 записей и то я сделаю 8 запросов (500 записей в файле), а то
4000 запросов к БД.
Для заполнении БД данными из файла (xml), делю данные на два массива,
один для insert (новые данные), второй для update (измененные данные, которые уже есть в бд).
Новые данные отслеживаю по некоему идентификатору, если в БД уже такой есть, то данные для обновления,
если нет, то для добавления.
Так вот, при добавлении новых данных в БД проблем нет Yii::$app->db->createCommand()->batchInsert
Подскажите как массово обновить данные по ключам, по типу batchInsert и условию WHERE IN (ключи)?
ЗЫ понятно что можно в цикле простым update сделать, но например у меня 4000 записей и то я сделаю 8 запросов (500 записей в файле), а то
4000 запросов к БД.
Re: Парсинг данных в БД.
перед тем, как пытаться сделать это через yii нужно задать себе вопрос, а как это должно выглядеть в обычном sql?
Re: Парсинг данных в БД.
ну и вообще, закинуть разбор xml в очередь и 4к запросов будет совсем не страшно
Re: Парсинг данных в БД.
Зачем таким заниматься? Выполни truncateTable и всё на insert
Идентификаторы записей в файле проставлены? Если да, то можно сделать как сказал.
Re: Парсинг данных в БД.
Не могу, должна быть возможность как импорта, так и ручного ввода. Если сделаю truncateTable, то весь ручной ввод убью.
Думаю что откажусь от инкреметного поля в бд и перейду на uuid, тогда можно будет сделать batch insert on duplicate key update
Re: Парсинг данных в БД.
Какой-то идентификатор ручного ввода есть? Отличаются ли записи ручного ввода от импортированных данных, может каким-нибудь статусом?
Re: Парсинг данных в БД.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
-
- Сообщения: 31
- Зарегистрирован: 2019.06.20, 12:38
Re: Парсинг данных в БД.
Да, сам пользуюсь всегда в таких случаях batch insert on duplicate key update. Бывает порой обновить нужно 10.000 строк, справляется на ура. Максимально наверное 40.000 строк обновлял. Для себя даже метод написал
Работает так $this->OnDuplicateKeyUpdate(ИмяТаблицы, МассивДанных);
Массив данных должен быть такой, например:
[
['id' => 10, 'text' => 'new']
['id' => 15, 'text' => 'new2']
['id' => 20, 'text' => 'newwwww1232']
]
Где id - автоинкримент (или любое название инкримента)
ИЛИ ЖЕ, если нужно ДОБАВИТЬ НОВЫЕ, то без автоинкримента массив строк=>значений. Добавляет новые. Новый даже в случае, если автоинримента такого нет.
Главное чтобы весь массив был с одними и теми же ключами в одном порядке, потому что название строк там берется из первого массива
Получается полезно в обоих случаях: когда нужно массово обновить или когда массово добавить. Пользуюсь на разных движках.
Код: Выделить всё
public function OnDuplicateKeyUpdate ($tablename, $updateData) {
// получаем ключи с первой иттерации и будем использовать их в дальнейшем
foreach ($updateData as $key) {
$name_keys = array_keys($key);
break;
}
foreach ($name_keys as $key) {
$query .= "`{$key}` = VALUES(`{$key}`)";
if($key != end($name_keys)) $query .= ", ";
}
$db = Yii::$app->db;
$sql = $db->queryBuilder->batchInsert($tablename, $name_keys, $updateData);
$result = $db->createCommand($sql . ' ON DUPLICATE KEY UPDATE ' . $query)->execute();
if ($result) {
return $result;
} else {
return false;
}
}
Массив данных должен быть такой, например:
[
['id' => 10, 'text' => 'new']
['id' => 15, 'text' => 'new2']
['id' => 20, 'text' => 'newwwww1232']
]
Где id - автоинкримент (или любое название инкримента)
ИЛИ ЖЕ, если нужно ДОБАВИТЬ НОВЫЕ, то без автоинкримента массив строк=>значений. Добавляет новые. Новый даже в случае, если автоинримента такого нет.
Главное чтобы весь массив был с одними и теми же ключами в одном порядке, потому что название строк там берется из первого массива
Получается полезно в обоих случаях: когда нужно массово обновить или когда массово добавить. Пользуюсь на разных движках.
Re: Парсинг данных в БД.
Спасибо!