我需要在数据库表中插入大量记录。我从CSV文件中获取数据。我考虑过使用多插入语句以获得良好的性能。所以我做了类似以下的事情:
foreach($data as $key => $value) {
$insert[] = [
'id' => $value->id, 'is_published' => $value->is_published,
"first_name" => $value->first_name, "middle_name" => $value->middle_name, "last_name" => $value->last_name,
"description" => $value->description,
"created_at" => date("Y-m-d H:i:s",strtotime($value->created_at)),
"updated_at" => date("Y-m-d H:i:s",strtotime($value->changed_at))
];
}
if(!empty($insert)){
Model::insert($insert);
}
但是这样做我总是看到错误:
mysql服务器消失了。
我通过打印查询来调试它,我发现通过这样做,Laravel并没有在描述值中处理单引号或双引号,因为它在使用$model::save();
时会自动执行。如果描述值中包含单引号'
或双引号"
,则打印的查询版本会中断。
但是,如果我做一些像
这样的事情foreach($data as $key=>$value){
$model = new Model();
$model->id = $value->id;
$model->description = $value->description;
blah blah bla
$model->save();
}
它成功运行而不会产生任何错误。任何人都可以告诉我如何纠正这个问题吗?
答案 0 :(得分:2)
由于大量数据集引号问题没有错。当您尝试使用多插入一次插入所有行时,数据集变得太重。您需要增加max_allowed_packet,或者您需要以块的形式进行操作。 你可以使用chunk。 假设您想一次插入100个元素。你可以做那样的事。
if(!empty($insert))
{
$collection = collect($insert)->chunk(100)->toArray();
foreach ($collection as $insert)
{
// It will insert 100 items at a time
Model::insert($insert);
}
}
希望这会有所帮助:)
答案 1 :(得分:0)
您尝试批量插入多少记录? 你能尝试两个吗? 你可以尝试制作几个批量插入(如100乘100)。
通常,错误Mysql has gone away
表示数据库服务器终止查询,因为它等待的数据太多(查询太大)。
您通常可以在my.conf中为max_allowed_packet
var设置更高的值,以便一次发送更多数据。