データ量は増加し続けるため、多くの企業は大量のデータをデータベースにインポートする必要があります。しかし、開発者にとって、データを効率的にインポートする方法は検討する価値のある問題です。この記事では、ThinkPHP6 フレームワークで Mysql を使用してデータを一括インポートする方法を紹介します。
インポートを開始する前に、データを準備する必要があります。データは CSV、Excel などの形式でエクスポートしたり、コードから直接生成したりできます。この記事では、コードを使用してデータを生成します。
最初にデータ テーブルを作成しますuser
:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
次に、次のコードを記述して 1000 個のデータを生成します:
use thinkacadeDb; // 生成测试数据 $data = []; for ($i = 1; $i <= 1000; $i++) { $data[] = [ 'name' => 'User' . $i, 'age' => mt_rand(18, 60), ]; } // 批量插入数据 Db::name('user')->insertAll($data);
Mysql には、ファイルからテーブルにデータをインポートできる非常に便利な関数 LOAD DATA
が用意されています。データを CSV ファイルに保存し、LOAD DATA
コマンドを使用してデータをテーブルにインポートするだけです。
まず、すべてのデータを CSV ファイルに保存します。この例では、データを user.csv
ファイルに保存します。
use thinkacadeDb; $data = Db::name('user')->select(); $fp = fopen('user.csv', 'w'); //写数据到CSV文件中 foreach ($data as $item) { fputcsv($fp, [$item['name'], $item['age']]); } fclose($fp);
次に、次のコードを使用してデータをデータベースにインポートします。上のコードでは、まずインポートするファイル パスを指定し、次に SQL ステートメントを記述し、
LOAD DATA を使用してデータをデータベースにインポートします。インポートする前に、Mysql の local_infile
オプションがオンになっていることを確認する必要があることに注意してください。
関数は便利で高速ですが、データを保存する必要があります。データをファイルとして保存するため、SQL ステートメントを手動で記述する必要があり、操作が面倒です。 TP6 では、組み込みのバッチ挿入機能を使用して、一度に大量のデータを挿入できます。 上記の例では、次のコードを使用してデータベースにデータを挿入します。
use thinkacadeDb; $filename = 'user.csv'; $sql = <<<EOF LOAD DATA LOCAL INFILE '{$filename}' INTO TABLE `user` CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY ' ' (`name`, `age`) EOF; Db::query($sql);
上記のコードでは、最初にすべてのデータをクエリしてから、
insertAll## を使用します。 # データをバッチで挿入するメソッド。insertAll メソッドは、デフォルトで一度に最大 1,000 個のデータを挿入できることに注意してください。さらにデータを挿入する場合は、
insertAll メソッドで
$limit パラメーターを指定する必要があります。たとえば、次のコードは一度に最大 500 個のデータを挿入します。
use thinkacadeDb; $data = Db::name('user')->select(); $result = Db::name('user')->insertAll($data);
上記のコードでは、ループを使用してデータをバッチで挿入します。すべて完了するまで、毎回最大 500 個のデータを挿入できます。
概要: ThinkPHP6 で大量のデータをバッチでインポートすると、メモリ オーバーフローやパフォーマンスのボトルネックなどの問題が発生する可能性がありますが、Mysql の LOAD DATA 関数とバッチ挿入を使用することで、 TP6 関数には、手動でデータを一括挿入するなどの方法があり、データインポートの効率を効果的に向上させることができます。実際の開発プロセスでは、最適なインポート効果を達成するために、状況に応じて適切な方法を選択する必要があります。 以上がThinkPHP6 での一括データインポートに MySQL を使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。