Импорт нескольких CSV-файлов в таблицы mysql

ОБНОВИТЬ

Второе после того, как я разместил этот вопрос, благодаря синтаксическому освещению полученных запросов, я увидел, что пошло не так: строка $pl не открывалась с закрывающим тиком. Теперь я изменил его на:

 $pk = ',`%1$sUSER`,`%1$sTYPE`,`%1$sCODE`,`%1$sVALUE`,`%1$s';//WRONG $pk = '`,`%1$sUSER`,`%1$sTYPE`,`%1$sCODE`,`%1$sVALUE`,`%1$s';//OK 

Однако это ставит новый вопрос: почему объект PDO не возвращал мне ошибки для этого? выполнение запроса вручную обязательно вернет ошибку, говоря, что нет поля с именем fld2_AGE, , с запятой в конце. Почему у меня не было ошибок? есть идеи?

PS: любая идея, как повысить синтаксическую подсветку SO для решения моей проблемы? 🙂

Я оставляю исходный вопрос как ссылку / пример, хотя он больше не нуждается в решении


Хорошо, я использовал сценарий, который я написал некоторое время назад, чтобы импортировать несколько файлов csv из огромного файла, чтобы быстро импортировать данные в несколько таблиц mysql. Этот сценарий работал неудачно в прошлом (я думаю) до тех пор, пока не написал второй скрипт, в котором я случайно обрезал свои таблицы (глупый, я знаю). «Никакой большой», подумал я, поскольку у меня был сценарий, для восстановления моих данных было бы занято несколько секунд. К сожалению, я обнаружил, что теперь импортируется только один файл, и ошибки не отображаются. Ниже я вставил весь раздел db скрипта. Когда я выполняю этот код, все, что я получаю, это files imported successfully , которые являются последней строкой кода …

Я знаю, что это отказоустойчивый большой блок кода, с большим количеством печати в строковых форматах, что не улучшает читаемость, поэтому я также предоставил результирующие строки запроса ниже. Насколько я могу судить, они выглядят хорошо отформатированными, как и файлы (я проверил). Может ли кто-нибудь сказать, где еще я должен искать ошибки? Это была бы большая помощь … Спасибо!

 <?php $files = array_fill_keys(array('filename1','filename2','filename3','filename4'),''); //$files === array of handles fputcsv($files['filename1'],array('values','from','other','files'),';'); $tbls = array_combine($files,array('tblname1','tblname2','tblname3','tblname4')); $path = dirname(__FILE__)'/'; $qf = 'LOAD DATA LOCAL INFILE \'%s%s.csv\' INTO TABLE my_db.tbl_prefix_%s FIELDS TERMINATED BY \';\' OPTIONALLY ENCLOSED BY \'"\' LINES TERMINATED BY \'\n\''; $pref = array_combine($files,array('fld1_','fld2_','fld3_','fld3_')); $pkA = ' (`%1$sNAME`,`%1$sAGE'; $pk = '`,`%1$sUSER`,`%1$sTYPE`,`%1$sCODE`,`%1$sVALUE`,`%1$s'; try { $db = new PDO('mysql:host=mysqlhostn','user','pass'); foreach($files as $f) { $db->beginTransaction(); $db->exec(sprintf('TRUNCATE TABLE my_db.tbl_prefix_%s',$tbls[$f])); $db->commit(); } } catch(PDOException $e) { if ($db) { $db->rollBack(); $db = null; } die('DB connection/truncate failed: '.$e->getMessage()."\n"); } try { while($f = array_shift($files)) { $db->beginTransaction(); $q = sprintf($qf,$path,$f,$tbls[$f]).sprintf($pkA.($f !== 'agent' ? $pk : ''),$pref[$f]); switch($f) { case 'filename3': $q .= 'tbl3_specific_field'; break; case 'filename2': $q .= sprintf('tbl2_specific_field`,`%1$tbl2_specific_field2',$pref[$f]); break; case 'filename4': $q .= sprintf('tbl4_specific_field`,`%1$tbl4_specific_field2`,`%1$tbl4_specific_field3`,`%1$tbl4_specific_field4',$pref[$f]); break; } $stmt = $db->prepare($q.'`)'); $stmt->execute(); $db->commit(); } } catch(PDOException $e) { $db->rollBack(); $e = 'CSV import Failed: '.$e->getMessage(); $db=null; die($e."\n"); } $db = null; exit('files imported successfully'."\n"); ?> 

сгенерированные запросы – вывод выполнения:

 TRUNCATE TABLE my_db.tbl_prefix_tblname1 TRUNCATE TABLE my_db.tbl_prefix_tblname2 TRUNCATE TABLE my_db.tbl_prefix_tblname3 TRUNCATE TABLE my_db.tbl_prefix_tblname4 LOAD DATA LOCAL INFILE '/local/path/to/files/filename1.csv' INTO TABLE my_db.tbl_prefix_tblname1 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (`fld1_NAME`,`fld1_AGE`) LOAD DATA LOCAL INFILE '/local/path/to/files/filename2.csv' INTO TABLE my_db.tbl_prefix_tblname2 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (`fld2_NAME`,`fld2_AGE,`fld2_USER`,`fld2_TYPE`,`fld2_CODE`,`fld2_VALUE`,`fld2_tbl2_specific_field`,`fld2_tbl2_specific_field2`) LOAD DATA LOCAL INFILE '/local/path/to/files/filename3.csv' INTO TABLE my_db.tbl_prefix_tblname3 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (`fld3_NAME`,`fld3_AGE,`fld3_USER`,`fld3_TYPE`,`fld3_CODE`,`fld3_VALUE`,`fld3_tbl3_specific_field`) LOAD DATA LOCAL INFILE '/local/path/to/files/filename4.csv' INTO TABLE my_db.tbl_prefix_tblname4 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (`fld4_NAME`,`fld4_AGE,`fld4_USER`,`fld4_TYPE`,`fld4_CODE`,`fld4_VALUE`,`fld4_tbl4_specific_field`,`fld4_tbl4_specific_field2`,`fld4_tbl4_specific_field3`,`fld4_tbl4_specific_field4`) 

csv импортирован успешно

Файл1 импортируется, поскольку мне это нужно, пример первого файла:

11; 9

Хотя фактическое содержимое файла2 (которое не импортируется) выглядит следующим образом:

11; 9; 25; 5; FOOBAR, Z; 333; 321; 123

Оба первых поля содержат те же данные, что и они, обе таблицы имеют одинаковые определения полей, один и тот же механизм хранения (InnoDB), сопоставление (UTF-8) … Я понятия не имею, что вызывает проблему, поэтому любые советы будут очень оценили.

Solutions Collecting From Web of "Импорт нескольких CSV-файлов в таблицы mysql"

почему объект PDO не возвращал мне ошибки для этого?

Потому что MySQL выполнил ваш запрос без каких-либо ошибок. Только потому, что вы написали неправильный запрос, это не означает, что запрос неверен, что MySQL не примет его.

Всякий раз, когда вы произвольно генерируете SQL-запросы, проверяйте (путем отладки или даже более лучших модульных тестов), что запрос был создан правильно для того, что вы хотите сделать.

Если вы хотите получать исключение каждый раз при возникновении ошибки, включите это:

 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);