ハマログ

株式会社イーツー・インフォの社員ブログ

時限爆弾解除・・・!

コーディングに慣れてきて、楽しくなってきた、fujiです。

最近、MySQLでデータを取得して、別のDBに保存するバッチを実装しています。

情報単位でバッチを分けて実装する中で出た、エラーについて書きます。

コードを使いまわせる個所が多かったのと、Laravelはドキュメントが充実しているのでさくさく進んでいたのですが、下記のエラーが出ました。

<code>SQLSTATE[HY000]: General error: 1390 Prepared statement contains too many placeholders in hogehoge</code>

「準備済みステートメントに含まれるプレースホルダーが多すぎます」とのことで、一回にインサートする件数が多い (?) のが原因でした。

「件数が多い場合」を考慮しなきゃいけないのって、数万件からだと思ってたのですが7000件程度で考慮が必要になりました。。

Laravelが用意してくれてる関数を使って、1000件毎に区切ってインサートするよう対応しました。

<code>->chunk(1000, function ($getRecordObj) {
     $getRecordChunkArr = json_decode($getRecordObj, true);
     foreach ($getRecordChunkArr as $getRecordArr) {
          DB::connection('mysql')->table('plan_histories')
      ->insert($getRecordArr)
     }
 });</code>

既に実装済みのバッチも、今は件数が少なくても多くなる可能性があるので、エラーが出ないよう同じ処理にして「時限爆弾」を解除しましたーー

mysql

fuji   fuji   2018年12月26日


関連記事

Laravel ExcelでCSV出力したらSJISで出せなかったので自分で書きました

佐川急便か何かのシステムと連携するために、Shift_JISで出力したCSVを作…

Laravelの開発用サーバ(のポート)

自分の開発用ローカルマシンはMacなのでPHPがデフォルトでインストールされてい…

PhpSpreadsheetとTcpdfでExcelファイルから日本語PDFを作成してみる(そして失敗する)

はじめに PDFの帳票をLaravelから作成したかったので、いろいろ試していま…


← 前の投稿

次の投稿 →