webentwicklung-frage-antwort-db.com.de

Wie mache ich eine Masseneinfügung in mySQL mit node.js?

Wie würde man eine Masseneinfügung in mySQL durchführen, wenn Sie etwas wie https://github.com/felixge/node-mysql verwenden

88
crickeys

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.

[ [ [...], [...], [...] ] ]
204
Ragnar123

@ 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.

13
user19

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!

6
Stephen Gibson

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.

6
thewormsterror

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;
};
3
Sam

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);
3
Manuel Spigolon

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) => {...}
);
3

Wenn Ragnars Antwort für Sie nicht funktioniert. Hier ist wahrscheinlich der Grund (basierend auf meiner Erfahrung) -

  1. 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.

  2. 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.

1

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)
});
1
Sagar Gavhane

Ich hatte ein ähnliches Problem. Es wurde nur eines aus der Liste der Arrays eingefügt. Nach den folgenden Änderungen hat es funktioniert.

  1. [Params] an die Abfragemethode übergeben. 
  2. Die Abfrage von insert (a, b) in table1-Werte (?) ==> insert (a, b) in table1-Werte geändert? . dh. Die Umrandung um das Fragezeichen wurde entfernt. 

Hoffe das hilft. Ich benutze Mysql npm. 

0
user1998289