Comment faire une insertion en bloc dans mySQL si vous utilisez quelque chose comme https://github.com/felixge/node-mysql
Comment faire une insertion en bloc dans mySQL si vous utilisez quelque chose comme https://github.com/felixge/node-mysql
Réponses:
Les insertions en masse sont possibles en utilisant un tableau imbriqué, voir la page github
Les tableaux imbriqués sont transformés en listes groupées (pour les insertions groupées), par exemple
[['a', 'b'], ['c', 'd']]
se transforment en('a', 'b'), ('c', 'd')
Vous insérez simplement un tableau imbriqué d'éléments.
Un exemple est donné ici
var mysql = require('mysql');
var conn = mysql.createConnection({
...
});
var sql = "INSERT INTO Test (name, email, n) VALUES ?";
var values = [
['demian', 'demian@gmail.com', 1],
['john', 'john@gmail.com', 2],
['mark', 'mark@gmail.com', 3],
['pete', 'pete@gmail.com', 4]
];
conn.query(sql, [values], function(err) {
if (err) throw err;
conn.end();
});
Remarque: values
est un tableau de tableaux enveloppés dans un tableau
[ [ [...], [...], [...] ] ]
Il existe également un package node-msql totalement différent pour l'insertion en masse
conn.execute()
utilisation de déclarations préparées? Sinon, est-il possible d'utiliser des instructions préparées lors de l'insertion? Merci.
La réponse @ Ragnar123 est correcte, mais je vois beaucoup de gens dire dans les commentaires que cela ne fonctionne pas. J'ai eu le même problème et il semble que vous deviez envelopper votre tableau []
comme ceci:
var pars = [
[99, "1984-11-20", 1.1, 2.2, 200],
[98, "1984-11-20", 1.1, 2.2, 200],
[97, "1984-11-20", 1.1, 2.2, 200]
];
Il doit être passé comme [pars]
dans la méthode.
?
au lieu de ??
pour obtenir le bon groupement.
Je cherchais une réponse sur l'insertion d'objets en masse.
La réponse de Ragnar123 m'a amené à créer cette fonction:
function bulkInsert(connection, table, objectArray, callback) {
let keys = Object.keys(objectArray[0]);
let values = objectArray.map( obj => keys.map( key => obj[key]));
let sql = 'INSERT INTO ' + table + ' (' + keys.join(',') + ') VALUES ?';
connection.query(sql, [values], function (error, results, fields) {
if (error) callback(error);
callback(null, results);
});
}
bulkInsert(connection, 'my_table_of_objects', objectArray, (error, response) => {
if (error) res.send(error);
res.json(response);
});
J'espère que ça aide!
J'ai rencontré ceci aujourd'hui ( mysql 2.16.0) et j'ai pensé partager ma solution:
const items = [
{name: 'alpha', description: 'describes alpha', value: 1},
...
];
db.query(
'INSERT INTO my_table (name, description, value) VALUES ?',
[items.map(item => [item.name, item.description, item.value])],
(error, results) => {...}
);
Tous les accessoires à Ragnar123 pour sa réponse.
Je voulais juste l'élargir après la question posée par Josh Harington pour parler des identifiants insérés.
Ceux-ci seront séquentiels. Voir cette réponse: Est-ce qu'une insertion multi-lignes MySQL saisit les ID d'auto-incrémentation séquentielle?
Par conséquent, vous pouvez simplement faire ceci (remarquez ce que j'ai fait avec le result.insertId):
var statement = 'INSERT INTO ?? (' + sKeys.join() + ') VALUES ?';
var insertStatement = [tableName, values];
var sql = db.connection.format(statement, insertStatement);
db.connection.query(sql, function(err, result) {
if (err) {
return clb(err);
}
var rowIds = [];
for (var i = result.insertId; i < result.insertId + result.affectedRows; i++) {
rowIds.push(i);
}
for (var i in persistentObjects) {
var persistentObject = persistentObjects[i];
persistentObject[persistentObject.idAttributeName()] = rowIds[i];
}
clb(null, persistentObjects);
});
(J'ai extrait les valeurs d'un tableau d'objets que j'ai appelé persistentObjects.)
J'espère que cela t'aides.
Ceci est un "raw-copy-paste" rapide extrait pour pousser une colonne de fichier dans mysql avec node.js> = 11
250 000 lignes en quelques secondes
'use strict';
const mysql = require('promise-mysql');
const fs = require('fs');
const readline = require('readline');
async function run() {
const connection = await mysql.createConnection({
host: '1.2.3.4',
port: 3306,
user: 'my-user',
password: 'my-psw',
database: 'my-db',
});
const rl = readline.createInterface({ input: fs.createReadStream('myfile.txt') });
let total = 0;
let buff = [];
for await (const line of rl) {
buff.push([line]);
total++;
if (buff.length % 2000 === 0) {
await connection.query('INSERT INTO Phone (Number) VALUES ?', [buff]);
console.log(total);
buff = [];
}
}
if (buff.length > 0) {
await connection.query('INSERT INTO Phone (Number) VALUES ?', [buff]);
console.log(total);
}
console.log('end');
connection.close();
}
run().catch(console.log);
?
après VALUES
, sans crochets. De cette façon, un tableau de tableaux de colonnes peut être automatiquement traité dans des insertions en masse. Je l'ai utilisé pour analyser des centaines de mégaoctets de journaux d'accès dans MySQL.
Au cas où cela serait nécessaire, voici comment nous avons résolu l'insertion du tableau
la demande provient du facteur (vous regarderez "invités")
{
"author_id" : 3,
"name" : "World War II",
"date" : "01 09 1939",
"time" : "16 : 22",
"location" : "39.9333635/32.8597419",
"guests" : [2, 3, 1337, 1942, 1453]
}
Et comment nous avons scénarisé
var express = require('express');
var utils = require('./custom_utils.js');
module.exports = function(database){
var router = express.Router();
router.post('/', function(req, res, next) {
database.query('INSERT INTO activity (author_id, name, date, time, location) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name), date = VALUES(date), time = VALUES(time), location = VALUES(location)',
[req.body.author_id, req.body.name, req.body.date, req.body.time, req.body.location], function(err, results, fields){
if(err){
console.log(err);
res.json({ status: utils.respondMSG.DB_ERROR });
}
else {
var act_id = results.insertId;
database.query('INSERT INTO act_guest (user_id, activity_id, status) VALUES ? ON DUPLICATE KEY UPDATE status = VALUES(status)',
[Array.from(req.body.guests).map(function(g){ return [g, act_id, 0]; })], function(err, results, fields){
if(err){
console.log(err);
res.json({ status: utils.respondMSG.DB_ERROR });
}
else {
res.json({
status: utils.respondMSG.SUCCEED,
data: {
activity_id : act_id
}
});
}
});
}
});
});
return router;
};
Ragnar
La réponse de If ne fonctionne pas pour vous. Voici probablement pourquoi (d'après mon expérience) -
Je n'utilisais pas le node-mysql
package comme indiqué mon Ragnar
. J'utilisais mysql
package. Ils sont différents (si vous ne l'avez pas remarqué - tout comme moi). Mais je ne sais pas si cela a quelque chose à voir avec le ?
non fonctionnement, car cela semblait fonctionner pour de nombreuses personnes utilisant le mysql
package.
Essayez d'utiliser une variable au lieu de ?
Ce qui suit a fonctionné pour moi -
var mysql = require('node-mysql');
var conn = mysql.createConnection({
...
});
var sql = "INSERT INTO Test (name, email, n) VALUES :params";
var values = [
['demian', 'demian@gmail.com', 1],
['john', 'john@gmail.com', 2],
['mark', 'mark@gmail.com', 3],
['pete', 'pete@gmail.com', 4]
];
conn.query(sql, { params: values}, function(err) {
if (err) throw err;
conn.end();
});
J'espère que cela aide quelqu'un.
Peu de choses que je veux mentionner, c'est que j'utilise le package mysql pour établir une connexion avec ma base de données et ce que vous avez vu ci-dessous est du code de travail et écrit pour insérer une requête en masse.
const values = [
[1, 'DEBUG', 'Something went wrong. I have to debug this.'],
[2, 'INFO', 'This just information to end user.'],
[3, 'WARNING', 'Warning are really helping users.'],
[4, 'SUCCESS', 'If everything works then your request is successful']
];
const query = "INSERT INTO logs(id, type, desc) VALUES ?";
const query = connection.query(query, [values], function(err, result) {
if (err) {
console.log('err', err)
}
console.log('result', result)
});
J'avais un problème similaire. C'était juste en insérant un de la liste des tableaux. Cela a fonctionné après avoir apporté les modifications ci-dessous.
J'espère que cela t'aides. J'utilise mysql npm.
L'insertion en bloc dans Node.js peut être effectuée à l'aide du code ci-dessous. J'ai référé beaucoup de blog pour obtenir ce travail.
veuillez également consulter ce lien. https://www.technicalkeeda.com/nodejs-tutorials/insert-multiple-records-into-mysql-using-nodejs
Le code de travail.
const educations = request.body.educations;
let queryParams = [];
for (let i = 0; i < educations.length; i++) {
const education = educations[i];
const userId = education.user_id;
const from = education.from;
const to = education.to;
const instituteName = education.institute_name;
const city = education.city;
const country = education.country;
const certificateType = education.certificate_type;
const studyField = education.study_field;
const duration = education.duration;
let param = [
from,
to,
instituteName,
city,
country,
certificateType,
studyField,
duration,
userId,
];
queryParams.push(param);
}
let sql =
"insert into tbl_name (education_from, education_to, education_institute_name, education_city, education_country, education_certificate_type, education_study_field, education_duration, user_id) VALUES ?";
let sqlQuery = dbManager.query(sql, [queryParams], function (
err,
results,
fields
) {
let res;
if (err) {
console.log(err);
res = {
success: false,
message: "Insertion failed!",
};
} else {
res = {
success: true,
id: results.insertId,
message: "Successfully inserted",
};
}
response.send(res);
});
J'espère que ceci vous aidera.