Wie würde man eine Masseneinfügung in mySQL durchführen, wenn Sie etwas wie https://github.com/felixge/node-mysql verwenden
Bulk-Inserts sind durch Verwendung geschachtelter Arrays möglich, siehe Seite github
Verschachtelte Arrays werden in gruppierte Listen (für Bulk-Inserts) umgewandelt, z.
[['a', 'b'], ['c', 'd']]
wird zu('a', 'b'), ('c', 'd')
Sie fügen einfach ein verschachteltes Array von Elementen ein.
Ein Beispiel ist in hier
var mysql = require('node-mysql');
var conn = mysql.createConnection({
...
});
var sql = "INSERT INTO Test (name, email, n) VALUES ?";
var values = [
['demian', '[email protected]', 1],
['john', '[email protected]', 2],
['mark', '[email protected]', 3],
['pete', '[email protected]', 4]
];
conn.query(sql, [values], function(err) {
if (err) throw err;
conn.end();
});
Hinweis: values
ist ein Array von Arrays, die in einem Array eingeschlossen sind.
[ [ [...], [...], [...] ] ]
@ Ragnar123 Antwort ist korrekt, aber ich sehe viele Leute in den Kommentaren, dass es nicht funktioniert. Ich hatte das gleiche Problem und es scheint, als müssten Sie Ihr Array in []
wie folgt verpacken:
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]
];
Es muss wie [pars]
an die Methode übergeben werden.
Ich habe nach einer Antwort zum Einfügen von Objekten gesucht.
Die Antwort von Ragnar123 führte mich zu dieser Funktion:
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);
});
Ich hoffe es hilft!
Alle Requisiten an Ragnar123 für seine Antwort.
Ich wollte es nur erweitern, nachdem Josh Harington die Frage gestellt hatte, um über eingefügte IDs zu sprechen.
Diese werden sequentiell sein. Siehe diese Antwort: Führt ein sequenzielles MySQL-Mehrzeilen-ID-Kennzeichen zum automatischen Einfügen von Inhalten ein?
Daher können Sie dies einfach tun (beachten Sie, was ich mit der result.insertId gemacht habe):
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);
});
(Ich habe die Werte aus einem Array von Objekten gezogen, die ich als persistentObjects bezeichnet habe.)
Hoffe das hilft.
Für den Fall, dass dies hier erforderlich ist, haben wir das Einfügen eines Arrays gelöst
anfrage ist vom Postboten (Sie sehen "Gäste")
{
"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]
}
Und wie wir geschrieben haben
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;
};
Dies ist ein schnelles "raw-copy-paste" -Schnipsen, um eine Dateispalte in MySQL mit node.js> = 11 zu pushen
250k Reihe in wenigen Sekunden
'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);
Ich bin heute darauf gestoßen ( mysql 2.16.0) und dachte, ich würde meine Lösung teilen:
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) => {...}
);
Wenn Ragnar
s Antwort für Sie nicht funktioniert. Hier ist wahrscheinlich der Grund (basierend auf meiner Erfahrung) -
Ich habe kein node-mysql
-Paket verwendet, wie meine Ragnar
gezeigt hat. Ich habe das Paket mysql
verwendet. Sie sind anders (wenn Sie es nicht bemerkt haben - genau wie ich). Ich bin mir jedoch nicht sicher, ob es etwas damit zu tun hat, dass der ?
nicht funktioniert, da es für viele Leute, die das mysql
-Paket verwenden, zu funktionieren schien.
Verwenden Sie eine Variable anstelle von ?
.
Folgendes hat für mich gearbeitet -
var mysql = require('node-mysql');
var conn = mysql.createConnection({
...
});
var sql = "INSERT INTO Test (name, email, n) VALUES :params";
var values = [
['demian', '[email protected]', 1],
['john', '[email protected]', 2],
['mark', '[email protected]', 3],
['pete', '[email protected]', 4]
];
conn.query(sql, { params: values}, function(err) {
if (err) throw err;
conn.end();
});
Hoffe das hilft jemandem.
Einige Dinge, die ich erwähnen möchte, ist, dass ich mysql package verwende, um eine Verbindung mit meiner Datenbank herzustellen, und was Sie unten gesehen haben, ist Arbeitscode und für die Bulk-Einfüge-Abfrage geschrieben.
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)
});
Ich hatte ein ähnliches Problem. Es wurde nur eines aus der Liste der Arrays eingefügt. Nach den folgenden Änderungen hat es funktioniert.
Hoffe das hilft. Ich benutze Mysql npm.