Come si farebbe un inserimento in blocco in mySQL se si usasse qualcosa come https://github.com/felixge/node-mysql
Come si farebbe un inserimento in blocco in mySQL se si usasse qualcosa come https://github.com/felixge/node-mysql
Risposte:
Gli inserimenti in blocco sono possibili utilizzando array nidificati, vedere la pagina github
Gli array annidati vengono trasformati in elenchi raggruppati (per inserimenti in blocco), ad esempio
[['a', 'b'], ['c', 'd']]si trasforma in('a', 'b'), ('c', 'd')
Devi solo inserire un array nidificato di elementi.
Un esempio è fornito qui
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();
});
Nota: valuesè un array di array racchiuso in un array
[ [ [...], [...], [...] ] ]
C'è anche un pacchetto node-msql completamente diverso per l'inserimento di massa
conn.execute()per utilizzare le dichiarazioni preparate? In caso contrario, è possibile utilizzare dichiarazioni preparate quando si fanno gli inserti? Grazie.
@ Ragnar123 la risposta è corretta, ma vedo molte persone che dicono nei commenti che non funziona. Ho avuto lo stesso problema e sembra che tu debba avvolgere il tuo array in []questo modo:
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]
];
Deve essere passato come [pars]nel metodo.
?invece di ??ottenere il raggruppamento corretto.
Stavo cercando una risposta sull'inserimento di oggetti in blocco.
La risposta di Ragnar123 mi ha portato a realizzare questa funzione:
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);
});
Spero che sia d'aiuto!
Mi sono imbattuto in questo oggi ( mysql 2.16.0) e ho pensato di condividere la mia soluzione:
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) => {...}
);
Tutti gli oggetti di scena a Ragnar123 per la sua risposta.
Volevo solo ampliarlo dopo la domanda posta da Josh Harington per parlare degli ID inseriti.
Questi saranno sequenziali. Vedi questa risposta: un inserto MySQL a più righe acquisisce ID sequenziali di incremento automatico?
Quindi puoi semplicemente farlo (nota cosa ho fatto con 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);
});
(Ho estratto i valori da un array di oggetti che ho chiamato persistentObjects.)
Spero che questo ti aiuti.
Questo è un veloce "raw-copy-paste" ritagliato per spingere una colonna di file in mysql con node.js> = 11
250.000 file in pochi secondi
'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);
?dopo VALUES, senza parentesi. In questo modo array di array di colonne possono essere elaborati automaticamente in inserimenti di massa. L'ho usato per analizzare centinaia di megabyte di log di accesso in MySQL.
Nel caso fosse necessario, ecco come abbiamo risolto l'inserimento di array
la richiesta è del postino (guarderai "ospiti")
{
"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]
}
E come abbiamo scritto
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;
};
RagnarLa risposta di If non funziona per te. Probabilmente ecco perché (in base alla mia esperienza) -
Non stavo usando il node-mysqlpacchetto come mostrato nel mio file Ragnar. Stavo usando il mysqlpacchetto. Sono diversi (se non l'hai notato, proprio come me). Ma non sono sicuro che abbia qualcosa a che fare con il ?non funzionamento, dal momento che sembrava funzionare per molte persone che utilizzavano il mysqlpacchetto.
Prova a utilizzare una variabile invece di ?
Quanto segue ha funzionato per me:
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();
});
Spero che questo aiuti qualcuno.
Poche cose che voglio menzionare è che sto usando il pacchetto mysql per effettuare una connessione con il mio database e quello che hai visto di seguito è codice funzionante e scritto per l'inserimento di query di massa.
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)
});
Stavo avendo un problema simile. Ne stavo solo inserendo uno dall'elenco degli array. Ha funzionato dopo aver apportato le modifiche seguenti.
Spero che questo ti aiuti. Sto usando mysql npm.
L'inserimento in blocco in Node.js può essere eseguito utilizzando il codice seguente. Ho fatto riferimento a molti blog per ottenere questo lavoro.
si prega di fare riferimento anche a questo collegamento. https://www.technicalkeeda.com/nodejs-tutorials/insert-multiple-records-into-mysql-using-nodejs
Il codice di lavoro.
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);
});
Spero che questo ti possa aiutare.