更新
在我发布此问题之后的第二秒,由于对结果查询的语法突出显示,我看到了出了什么问题:该$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导入成功
File1正在被导入,这是第一个文件的示例:
11; 9
虽然file2的实际内容(未导入)如下所示:
11; 9; 25; 5; FOOBAR; Z; 333; 321; 123
前两个字段都包含相同的数据,两个表都具有相同的字段定义,相同的存储引擎(InnoDB),排序规则(UTF-8)…我不知道是什么引起了这个问题,所以任何建议都是非常感激。
为什么PDO对象没有为此向我吐出错误?
因为MySQL执行您的查询没有任何错误。仅因为您编写了错误的查询,这并不意味着该查询是MySQL不接受的错误。
每当您以编程方式生成SQL查询时,请(通过调试或更好的单元测试)验证是否已针对您要执行的操作正确创建了查询。
如果要在每次发生错误时获取异常,请启用该功能:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
如何将CSV文件导入MySQL表?我想把第一行数据用作列名。 我读到如何将CSV文件导入MySQL表?,但是唯一的答案是使用GUI而不是shell?
问题内容: 我想将csv文件导入到mysql中。 http://www.tech- recipes.com/rx/2345/import_csv_file_direct_into_mysql/ 但是csv中的列名称与数据库表中的列名称不同,我该怎么办?我想以编程方式来做。 问题答案: 您可以创建一个脚本来解析您的csv文件并将数据放入db。 就像是:
我有一个包含数百个csv文件的文件夹。每个文件都有日期作为它的名称,因为我的目录中的数据每天都在创建,例如2020-01-15.csv、2020-01-16.csv、2020-01-17.csv等。我正在寻找一个最好的方法来每天导入我的文件到mysql数据库中,并为每个文件创建表(不需要创建表,如果表的文件名已经存在)。 到目前为止,为了将文件导入到mysql数据库中,我使用了,但我当时使用它导入
问题内容: 我创建了一个数据库和一个表。我还创建了所有需要的字段。我创建了46个字段,其中一个是该行的ID。CSV不包含ID字段,也不包含列的标题。我对所有这些都是陌生的,但一直在努力解决。我不是在这里懒惰地寻求答案,而是在寻找方向。 我试图弄清楚如何导入CSV,但是让它开始从第二个字段开始导入数据,因为我希望auto_increment将填充ID字段,这是我创建的第一个字段。 我没有运气就尝试了
问题内容: 将csv文件上传到mysql表的最佳/最快方法是什么?我想将第一行数据用作列名。 发现了这一点: 如何将CSV文件导入MySQL表 但是唯一的答案是使用GUI而不是Shell? 问题答案: 您无需编写脚本即可从CSV文件中提取信息,而是可以直接将MYSQL链接到该文件并使用以下SQL语法上传信息。 要将Excel文件导入MySQL,请先将其导出为CSV文件。从生成的CSV文件中删除CS
问题内容: 我想将目录中的多个文件读入,并将它们连接成一个大的。我还无法弄清楚。这是我到目前为止的内容: 我想我在for循环中需要一些帮助吗??? 问题答案: 如果所有csv文件中的列均相同,则可以尝试以下代码。我已添加,header=0以便在读取csv第一行后可以将其分配为列名。 import pandas as pd import glob path = r’C:\DRO\DCL_rawdat