Maison  >  Article  >  cadre php  >  Utilisation de Mysql pour l'importation de données en masse dans ThinkPHP6

Utilisation de Mysql pour l'importation de données en masse dans ThinkPHP6

王林
王林original
2023-06-20 13:40:432373parcourir

Alors que la quantité de données continue d'augmenter, de nombreuses entreprises doivent importer de grandes quantités de données dans des bases de données. Mais pour les développeurs, comment importer efficacement des données est une question qui mérite d’être explorée. Dans cet article, nous présenterons comment utiliser Mysql dans le framework ThinkPHP6 pour l'importation de données en masse.

  1. Préparer les données

Avant de commencer l'importation, nous devons préparer les données. Les données peuvent être exportées dans des formats tels que CSV, Excel ou générées directement à partir du code. Dans cet article, nous utiliserons du code pour générer des données.

Créez d'abord une table de données user : 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);

然后使用以下代码将数据导入到数据库中:

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);

在上述代码中,我们首先指定要导入的文件路径,然后编写SQL语句,使用LOAD DATA将数据导入到数据库中。需要注意的是,在导入之前需要确保Mysql的local_infile选项已经开启。

  1. 使用TP6自带的批量插入功能导入数据

Mysql的LOAD DATA功能虽然方便快捷,但是需要将数据保存为文件,而且需要手动编写SQL语句,操作起来较为繁琐。在TP6中,我们可以使用自带的批量插入功能,一次性插入大量数据。

在上面的例子中,我们使用以下代码将数据插入到数据库中:

use thinkacadeDb;

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

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

在上述代码中,我们首先查询所有数据,然后使用insertAll方法批量插入数据。需要注意的是,insertAll方法默认一次性最多插入1000条数据。如果要插入更多数据,需要在insertAll方法中指定$limit

use thinkacadeDb;

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

$limit = 500;
$total = count($data);
for ($i = 0; $i < $total; $i += $limit) {
    $result = Db::name('user')->insertAll(array_slice($data, $i, $limit));
}

Ensuite, écrivez le code suivant pour générer 1000 éléments de données :

rrreee

    Utilisez la fonction LOAD DATA de MySQL pour importer des données

    Mysql fournit une fonction très pratique LOAD DATA, qui peut importer des données de fichiers dans des tables. Il nous suffit de sauvegarder les données dans un fichier CSV, puis d'utiliser la commande LOAD DATA pour importer les données dans la table.

    🎜Tout d'abord, enregistrez toutes les données dans un fichier CSV. Dans cet exemple, nous sauvegardons les données dans un fichier user.csv : 🎜rrreee🎜 Utilisons ensuite le code suivant pour importer les données dans la base de données : 🎜rrreee🎜 Dans le code ci-dessus, nous précisons d'abord que nous voulons importer le chemin du fichier, puis écrire des instructions SQL et utiliser LOAD DATA pour importer les données dans la base de données. Il convient de noter qu'avant d'importer, vous devez vous assurer que l'option local_infile de Mysql est activée. 🎜
      🎜Utilisez la fonction d'insertion par lots intégrée de TP6 pour importer des données🎜🎜🎜La fonction LOAD DATA de MySQL est pratique et rapide, mais elle nécessite de sauvegarder les données sous forme de fichier et L'écriture manuelle d'instructions SQL est fastidieuse. Dans TP6, nous pouvons utiliser la fonction d'insertion par lots intégrée pour insérer une grande quantité de données à la fois. 🎜🎜Dans l'exemple ci-dessus, nous utilisons le code suivant pour insérer des données dans la base de données : 🎜rrreee🎜Dans le code ci-dessus, nous interrogeons d'abord toutes les données, puis utilisons la méthode insertAll pour insérer des données dans lots. Il convient de noter que la méthode insertAll peut insérer par défaut jusqu'à 1 000 éléments de données à la fois. Si vous souhaitez insérer plus de données, vous devez spécifier le paramètre $limit dans la méthode insertAll. Par exemple, le code suivant insérera jusqu'à 500 éléments de données à la fois : 🎜rrreee🎜Dans le code ci-dessus, nous utilisons une boucle pour insérer des données par lots. Un maximum de 500 données peuvent être insérées à chaque fois jusqu'à ce qu'elles soient toutes complétées. 🎜🎜Résumé : 🎜🎜Lors de l'importation de gros lots de données dans ThinkPHP6, vous pouvez rencontrer des problèmes tels qu'un débordement de mémoire et des goulots d'étranglement de performances. Cependant, en utilisant la fonction LOAD DATA de Mysql, la fonction d'insertion par lots intégrée de TP6, l'insertion manuelle par lots de données, etc. Cette méthode peut améliorer efficacement l’efficacité de l’importation de données. Dans le processus de développement actuel, il est nécessaire de choisir la méthode appropriée en fonction de la situation pour obtenir un effet d'importation optimal. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn