首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有报价的Laravel Multi Insert问题

有报价的Laravel Multi Insert问题
EN

Stack Overflow用户
提问于 2016-09-22 08:40:13
回答 2查看 1.8K关注 0票数 9

我需要将大量的记录插入到数据库表中。我正在从CSV文件中获取数据。为了获得良好的性能,我考虑使用一个多插入语句。所以我做了一些类似的事情:

代码语言:javascript
复制
 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没有处理描述值中的单引号或双引号,就像它在usiung $model::save();中自动执行的那样。如果描述值中包含单引号'或双引号",则打印的查询版本会中断。

但如果我做了一些事情

代码语言:javascript
复制
foreach($data as $key=>$value){
   $model = new Model();
   $model->id = $value->id;
   $model->description = $value->description;
   blah blah bla

   $model->save();
}

它成功地运行,没有产生任何错误。有人能告诉我如何纠正这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-26 17:08:39

这是由于大量的数据,没有错的报价问题。当您试图一次使用多插入插入所有行时,数据集会变得太重。要么您需要增加max_allowed_packet,要么您需要分块完成。你可以用块来做这个。假设您想一次插入100个元素。你可以做这样的事。

代码语言:javascript
复制
 if(!empty($insert))
 {

    $collection = collect($insert)->chunk(100)->toArray();

    foreach ($collection as $insert)
    {
       // It will insert 100 items at a time

        Model::insert($insert);
    }

 }

希望这会有所帮助:)

票数 2
EN

Stack Overflow用户

发布于 2016-09-26 07:16:45

您尝试大容量插入的记录有多少?你能试两下吗?你能试着做几个批量插入(比如100×100)吗?

通常,错误Mysql has gone away意味着数据库服务器由于等待太多的数据(您的查询太大)而终止了查询。

您通常可以在max_allowed_packet中将一个较高的值设置为my.conf变量,以允许您一次发送更多数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39634178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档