2016-12-07 1 views
0

Laravel Framework에서 사용되는 컨트롤러에 함수를 작성했습니다. 이 함수는 * .csv 파일의 파일 경로를 가져온 다음 원시 대량 삽입 문과 함께이 * .csv 파일의 모든 요소를 ​​데이터베이스에 삽입합니다. 문제는 함수가 실행될 때 요소가 데이터베이스 테이블에 저장되지 않는다는 것입니다. 나는 어떤 오류도 내지 않는다. SQL Server 관리자에서 쿼리를 실행하면 문제없이 요소가 삽입됩니다. 내가 뭘 잘못하고 데이터베이스에 CSV 파일의 요소를 일괄 적으로 삽입하는 더 좋은 방법이 있습니까? 여기 Laravel Raw Bulk 삽입

함수에 대한 코드입니다 :

 public static function bulkInsertCSV($filePath){ 

      $sql = "use [testDatabase] BULK INSERT [dbo].[testTable] 
        FROM '" . $filePath . "' WITH (FIELDTERMINATOR = ';'," 
        . "ROWTERMINATOR = '\\n');"; 
      //DB::statement($sql); 
      DB::statement(DB::raw($sql)); 
     } 

안부, 얄친

답변

0

내 CSV 파일을 처리하기위한 laravel-excel 라이브러리를 사용하여 좋아, 그것은 조금 더 쉽게 관리 할 수 ​​및 수 나에게 "laravel-y"를 더 느낀다.

laravel/excel lbirary : http://www.maatwebsite.nl/laravel-excel/docs/getting-started#installation 라이브러리. 당신이 다음 할 거라고 무엇

은 다소 간단하다

Excel::filter('chunk')->load($filePath)->chunk(500, function($rows){ 
    foreach($rows as $row) { 
     $data = collect([]); 
     foreach(App\TestTable::getFillable() as $fillable) { 
      if (isset($row[$fillable])) { 
       $data->put($fillable, $row[$fillable]); 
      } 
     } 

     App\TestTable::create($data->toArray()); 
    } 
}); 

참고 :

chunk 우리가 메모리가 부족하지 않습니다 보장합니다 사용
  • .
  • getFillable() 메서드는 TestTable 모델에서 protected $fillable = []; 속성을 정의했다고 가정합니다.
  • testTablecolumn namescsvfilecolumn names과 일치합니다.

잘하면이 도움이됩니다.

+0

이것은 좋은 해결책이 될 것입니다.하지만 csv에는 많은 열이있는 1.000.000 행까지 포함될 수 있습니다. PHPExcel을 사용하여 이미 시도했지만 실제로는 느리다 (삽입 작업에 약 10 분). 당신의 솔루션은 약 7 분이 필요했습니다. 아직도 너무 많이. SQL에 BULK INSERT를 사용하면 약 1 분이 소요됩니다. 그래서 당신의 해결책은 제가 찾고있는 것이 아니라 어쨌든 고맙습니다. :) – Yasemin