ThinkPHP6 での一括データインポートに MySQL を使用する

王林
リリース: 2023-06-20 13:40:43
オリジナル
2429 人が閲覧しました

データ量は増加し続けるため、多くの企業は大量のデータをデータベースにインポートする必要があります。しかし、開発者にとって、データを効率的にインポートする方法は検討する価値のある問題です。この記事では、ThinkPHP6 フレームワークで Mysql を使用してデータを一括インポートする方法を紹介します。

  1. データの準備

インポートを開始する前に、データを準備する必要があります。データは 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 thinkacadeDb;

// 生成测试数据
$data = [];
for ($i = 1; $i <= 1000; $i++) {
    $data[] = [
        'name' => 'User' . $i,
        'age' => mt_rand(18, 60),
    ];
}

// 批量插入数据
Db::name('user')->insertAll($data);
ログイン後にコピー
  1. Mysql のコードを使用します。データをインポートする LOAD DATA 関数

Mysql には、ファイルからテーブルにデータをインポートできる非常に便利な関数 LOAD DATA が用意されています。データを CSV ファイルに保存し、LOAD DATA コマンドを使用してデータをテーブルにインポートするだけです。

まず、すべてのデータを CSV ファイルに保存します。この例では、データを user.csv ファイルに保存します。

use thinkacadeDb;

$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 オプションがオンになっていることを確認する必要があることに注意してください。

TP6 の組み込みバッチ挿入関数を使用してデータをインポートする
  1. Mysql の
LOAD DATA

関数は便利で高速ですが、データを保存する必要があります。データをファイルとして保存するため、SQL ステートメントを手動で記述する必要があり、操作が面倒です。 TP6 では、組み込みのバッチ挿入機能を使用して、一度に大量のデータを挿入できます。 上記の例では、次のコードを使用してデータベースにデータを挿入します。

use thinkacadeDb;

$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 thinkacadeDb;

$data = Db::name('user')->select();

$result = Db::name('user')->insertAll($data);
ログイン後にコピー
上記のコードでは、ループを使用してデータをバッチで挿入します。すべて完了するまで、毎回最大 500 個のデータを挿入できます。 概要:

ThinkPHP6 で大量のデータをバッチでインポートすると、メモリ オーバーフローやパフォーマンスのボトルネックなどの問題が発生する可能性がありますが、Mysql の LOAD DATA 関数とバッチ挿入を使用することで、 TP6 関数には、手動でデータを一括挿入するなどの方法があり、データインポートの効率を効果的に向上させることができます。実際の開発プロセスでは、最適なインポート効果を達成するために、状況に応じて適切な方法を選択する必要があります。

以上がThinkPHP6 での一括データインポートに MySQL を使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート