Batch Insert отловить ошибки

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
louisvuitton
Сообщения: 196
Зарегистрирован: 2014.02.16, 03:09

Batch Insert отловить ошибки

Сообщение louisvuitton » 2019.07.10, 03:24

Здравствуйте,
Делаю некий импорт многих строк.
Вставляю их в базу с помощью batchInsert.
Если в какой то из строк ошибка (например duplicate уникального поля) то получается fatal error и не вставляются все строки вообще.

Можно ли как-то сделать так, чтобы все безошибочные строки вставлялись, а те что вызывают ошибку откидывались?
Если да, то каким образом ?

Аватара пользователя
samdark
Администратор
Сообщения: 9171
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Batch Insert отловить ошибки

Сообщение samdark » 2019.07.10, 10:06

foreach + try-catch.

masson
Сообщения: 497
Зарегистрирован: 2012.07.03, 15:59

Re: Batch Insert отловить ошибки

Сообщение masson » 2019.07.10, 10:33

Либо, если MySQL, то гуглить по фразе ON DUPLICATE KEY

louisvuitton
Сообщения: 196
Зарегистрирован: 2014.02.16, 03:09

Re: Batch Insert отловить ошибки

Сообщение louisvuitton » 2019.07.10, 10:44

foreach это получается по одной вставлять?

Аватара пользователя
SiZE
Сообщения: 2697
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Batch Insert отловить ошибки

Сообщение SiZE » 2019.07.10, 10:45

masson писал(а):
2019.07.10, 10:33
Либо, если MySQL, то гуглить по фразе ON DUPLICATE KEY
Тут скорее INSERT IGNORE
в поиске работы

masson
Сообщения: 497
Зарегистрирован: 2012.07.03, 15:59

Re: Batch Insert отловить ошибки

Сообщение masson » 2019.07.10, 11:33

SiZE писал(а):
2019.07.10, 10:45
masson писал(а):
2019.07.10, 10:33
Либо, если MySQL, то гуглить по фразе ON DUPLICATE KEY
Тут скорее INSERT IGNORE
Да, что-то я подзабыл. Почему-то думалось что ON DUPLICATE KEY может быть либо UPDATE либо IGNORE, а оказывается только UPDATE.
Anyway, гуглить надо по обеим фразам. А если точнее, то по слову INSERT :)

louisvuitton
Сообщения: 196
Зарегистрирован: 2014.02.16, 03:09

Re: Batch Insert отловить ошибки

Сообщение louisvuitton » 2019.07.18, 14:41

Мне не надо именно duplicate, ошибки в заполнении могут быть любыми (например строка в числовое поле, дата не в том формате и т.д.)

Переписал на active record поочередное создание модели и save() с валидацией, теперь на половине файла вылетает с нехваткой памяти =\
Это ожидаемо или я что-то упускаю? Файл excel на ~6000 строк и на ~20 столбцов (20 полей в модели)
Можно как-то разбить группами например по 500 строк, очищать память, опять 500 и т.д. до завершения?

masson
Сообщения: 497
Зарегистрирован: 2012.07.03, 15:59

Re: Batch Insert отловить ошибки

Сообщение masson » 2019.07.20, 09:30

Я бы костыль быстрый написал :
Идея такая - считывать xls как csv построчно в цикле (все поля в массив), загонять данные в одну модель (setAttributes), валидировать и проверять ошибки, по ходу формировать массив для batchInsert, по достижении 500 записей сливать в таблицу ... Как-то так

vv-off
Сообщения: 23
Зарегистрирован: 2018.01.12, 11:49

Re: Batch Insert отловить ошибки

Сообщение vv-off » 2019.07.25, 09:02

А есть возможность работать в Yii2 со множественной вставкой в таблицу БД через active record, чтобы не создавать в цикле 100500 моделей?

masson
Сообщения: 497
Зарегистрирован: 2012.07.03, 15:59

Re: Batch Insert отловить ошибки

Сообщение masson » 2019.07.25, 13:31

Я же выше описал вариант. Создаешь одну модель, назначаешь ей атрибуты через setAttributes, потом валидируешь, потом назначаешь ей атрибуты через setAttributes, потом валидируешь .... 100500 раз

Ответить