Страница 1 из 1

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

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

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

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

Добавлено: 2019.07.10, 10:06
samdark
foreach + try-catch.

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

Добавлено: 2019.07.10, 10:33
masson
Либо, если MySQL, то гуглить по фразе ON DUPLICATE KEY

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

Добавлено: 2019.07.10, 10:44
louisvuitton
foreach это получается по одной вставлять?

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

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

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

Добавлено: 2019.07.10, 11:33
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 :)

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

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

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

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

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

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

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

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

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