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

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

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

Сообщение louisvuitton »

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

Можно ли как-то сделать так, чтобы все безошибочные строки вставлялись, а те что вызывают ошибку откидывались?
Если да, то каким образом ?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

foreach + try-catch.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

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

Сообщение masson »

Либо, если MySQL, то гуглить по фразе ON DUPLICATE KEY
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

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

Сообщение louisvuitton »

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

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

Сообщение SiZE »

masson писал(а): 2019.07.10, 10:33 Либо, если MySQL, то гуглить по фразе ON DUPLICATE KEY
Тут скорее INSERT IGNORE
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

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

Сообщение masson »

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
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

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

Сообщение louisvuitton »

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

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

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

Сообщение masson »

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

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

Сообщение vv-off »

А есть возможность работать в Yii2 со множественной вставкой в таблицу БД через active record, чтобы не создавать в цикле 100500 моделей?
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

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

Сообщение masson »

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