मैं नोड .js का उपयोग करके mySQL में एक बल्क इंसर्ट कैसे करूँ


123

Https://github.com/felixge/node-mysql जैसी किसी चीज़ का उपयोग करने पर कोई mySQL में बल्क इंसर्ट कैसे करेगा


आपकी समस्या क्या है? क्या आप इसे उसी तरह कर सकते हैं जैसे एक sql कमांड के साथ? जब आप सभी डेटा सम्मिलित नहीं करते हैं, तो बस अगली कमांड शुरू करें।
एंड्री सिदोरोव

3
मैं इस धारणा के अधीन था कि BULK आवेषण कई एकल आवेषण की तुलना में तेज़ हैं।
क्रिकेय्स

तार स्तर पर वे एक ही हैं। Mysql प्रोटोकॉल में 'बल्क इंसर्ट' नहीं है
एंड्री सिदोरोव

1
mySQL में कई सम्मिलित हैं, आप केवल VALUES कीवर्ड का उपयोग करते हैं। dev.mysql.com/doc/refman/5.5/en/insert.html INSERT कथन जो VALUES सिंटैक्स का उपयोग करते हैं, कई पंक्तियों को सम्मिलित कर सकते हैं। ऐसा करने के लिए, कॉलम मानों की कई सूचियों को शामिल करें, प्रत्येक कोष्ठक के भीतर संलग्न और अल्पविराम द्वारा अलग किया गया। उदाहरण: INSERT INTO tbl_name (a, b, c) VALUES (1,2,3), (4,5,6), (7,8,9);
क्रिकेय्स

जवाबों:


288

नेस्टेड सरणी का उपयोग करके बल्क आवेषण संभव है, जीथब पृष्ठ देखें

नेस्टेड सरणियों को समूहबद्ध सूचियों (थोक आवेषण के लिए) [['a', 'b'], ['c', 'd']]में बदल दिया जाता है , उदाहरण के लिए ('a', 'b'), ('c', 'd')

आप बस तत्वों का एक नेस्टेड सरणी सम्मिलित करते हैं।

एक उदाहरण यहाँ दिया गया है

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

नोट: valuesएक सरणी में लिपटे सरणियों का एक सरणी है

[ [ [...], [...], [...] ] ]

थोक प्रविष्टि के लिए एक पूरी तरह से अलग नोड-एमएसक्यूएल पैकेज भी है


2
क्या यह conn.execute()तैयार किए गए कथनों का उपयोग करने के समान सुरक्षा प्रदान करता है ? यदि नहीं, तो आवेषण करते समय तैयार किए गए बयानों का उपयोग करना संभव है? धन्यवाद।
विग्स

2
हां, इस पद्धति से मान बच जाते हैं। मुझे लगता है कि यह तैयार किए गए कथनों के समान ही तंत्र है, जो आंतरिक रूप से कनेक्शन.स्केप () का भी उपयोग करता है।
रागनारजी ११

7
यह मुझे भ्रमित कर रहा है। सरणी को क्यों [[['ए', 'बी'], ['सी', 'डी']] और नहीं [['ए', 'बी'], ['सी', '' डी '' होना चाहिए। ']] जैसे प्रलेखन कहता है?
विक्टोरियो बेर्रा

12
विक्टरियो बेर्रा, ऐसा इसलिए है क्योंकि सबसे बाहरी सरणी सामान्य रूप से कथन में केवल मिलान में प्रश्न मिलान है। उदाहरण के लिए, यदि आपके पास दो प्रश्न चिह्न प्लेसहोल्डर हैं, तो आपके पास [param1, param2] होगा। "उपयोगकर्ताओं को बताएं? कहाँ आईडी =?", [कॉलम, आईडी] इसलिए, कॉलम को पहले प्रश्न चिह्न और आईडी को दूसरे नंबर पर विस्तारित किया जाएगा।
सेले

3
दुर्भाग्य से यह जवाब मेरे लिए काम नहीं कर रहा है। मैंने सचमुच आपके उत्तर की नकल की लेकिन कोई सफलता नहीं मिली। मैंने stackoverflow.com/questions/41170849/…
इवान पांडेसिव

19

@ Ragnar123 जवाब सही है, लेकिन मैं बहुत से लोगों को टिप्पणियों में कह रहा हूं कि यह काम नहीं कर रहा है। मुझे भी यही समस्या थी और ऐसा लगता है कि आपको अपनी सरणी को []इस तरह से लपेटने की आवश्यकता है :

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

इसे [pars]विधि की तरह पारित करने की आवश्यकता है ।


6
हाँ, किसी कारण के लिए यह एक सरणी होना चाहिए, सरणियों की एक सरणी ...
जो

इसके अलावा ऐसा लगता है कि इसे सही समूह बनाने के ?बजाय एक विलक्षण की आवश्यकता है ??
फेडेरिको

15

मैं थोक डालने वाली वस्तुओं पर एक उत्तर की तलाश में था।

Ragnar123 के जवाब ने मुझे यह कार्य करने के लिए प्रेरित किया:

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

आशा करता हूँ की ये काम करेगा!


11

मैं आज ( mysql 2.16.0) में भाग गया और सोचा कि मैं अपना समाधान साझा करूंगा:

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
मुझे आपका समाधान पसंद है
जो

यह समाधान मेरे लिए काम किया! स्व-परीक्षा! POSTMAN: [{"textQuestionBuilderID": "5", "CandidID": "ABC123", "resultSelected": "sfgh"}, {"textQuestionBuilderID": "6", "CandidID": "ABC123", "resultSelected": "sfgh"}, {"textQuestionBuilderID": "7", "CandidID": "ABC123", "resultSelected": "sfgh"}, {"textQuestionBuilderID": "8", "CandidID": "ABC123", "resultSelectedellection ":" sfgh "}]
ब्रायन

8

सभी अपने जवाब के लिए Ragnar123 को सहारा देते हैं।

जोश हरिंगटन द्वारा डाले गए आईडी के बारे में बात करने के लिए पूछे गए सवाल के बाद मैं इसका विस्तार करना चाहता था।

ये क्रमिक होंगे। इस उत्तर को देखें: क्या MySQL बहु-पंक्ति आवेषण अनुक्रमिक स्वायत्त पहचान आईडी बनाती है?

इसलिए आप ऐसा कर सकते हैं (ध्यान दें कि मैंने 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);
  });

(मैंने उन ऑब्जेक्ट्स की एक सरणी से मान खींचा है, जिन्हें मैंने persistentObjects कहा है।)

उम्मीद है की यह मदद करेगा।


क्या हम इस बात की गारंटी देते हैं कि एक साथ आवेषण के मामले में रेस कंडीशन अभ्यस्त मिक्स इन्स आईडी नहीं है?
प्युर्फन

1
@Purefan मेरे परीक्षणों के अनुसार हां, हालांकि कौन जानता है कि क्या यह कभी बदलेगा।

ध्यान दें, कि यह तभी काम करेगा जब auto_increment स्टेप साइज 1 के मूल मूल्य पर हो। 1. dev.mysql.com/doc/refman/5.7/en/…
luksch

6

यह एक तेज़ "रॉ-कॉपी-पेस्ट" है, जो नोड के साथ mysql में फ़ाइल कॉलम को पुश करने के लिए छीन लिया गया है। js> = 11

कुछ सेकंड में 250k पंक्ति

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

1
यह आश्चर्यजनक रूप से अच्छी तरह से काम करता है, धन्यवाद! एडाप्टर्स पर ध्यान दें: भले ही आपके पास INSERT में कई कॉलम हों, लेकिन कुंजी को बिना किसी कोष्ठक के ?बाद एकल रखना है VALUES। इस तरह से स्तंभों के सरणियों की सरणी को बल्क आवेषण में स्वचालित रूप से संसाधित किया जा सकता है। इसका उपयोग MySQL में सैकड़ों मेगाबाइट एक्सेस लॉग का विश्लेषण करने के लिए किया गया था।
एलेक्स पाका

मुझे एहसास नहीं था कि आप इसे विखंडू में क्यों तोड़ रहे थे जब तक कि मैंने इसके बिना कोशिश नहीं की। कुछ बिंदु पर मेरा आवेषण सर्वर के लिए एक समय पर फैशन में संसाधित होने के लिए बहुत बड़ा हो गया और मुझे ईपीआईपीई त्रुटि मिली। डालने को विखंडू में तोड़कर ठीक करता है। :)
किट पीटर्स

4

इस मामले में कि यहाँ कैसे हम सरणी के सम्मिलित हल हल है

अनुरोध डाकिया से है (आप "मेहमान" को देखेंगे)

 {
  "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]
}

और हमने कैसे स्क्रिप्टिंग की

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

2

यदि Ragnarउत्तर आपके लिए काम नहीं करता है। यहाँ शायद ऐसा क्यों है (मेरे अनुभव के आधार पर) -

  1. node-mysqlजैसा कि मेरा दिखाया गया मैं पैकेज का उपयोग नहीं कर रहा था Ragnar। मैं mysqlपैकेज का उपयोग कर रहा था । वे अलग हैं (यदि आपने ध्यान नहीं दिया - मेरी तरह)। लेकिन मुझे यकीन नहीं है कि यह ?काम नहीं करने के साथ कुछ भी करना है , क्योंकि यह mysqlपैकेज का उपयोग करने वाले कई लोगों के लिए काम करने के लिए लग रहा था ।

  2. इसके बजाय एक चर का उपयोग करने का प्रयास करें ?

निम्नलिखित ने मेरे लिए काम किया -

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

आशा है कि यह किसी की मदद करता है।


मुझे लगता है कि आप मूल्यों को [] रखना भूल सकते हैं। वह मेरे साथ भी हुआ। यह होना चाहिए: con.query (sql, [मान], फ़ंक्शन () {}) इसके बजाय: conn.query (sql, मान, फ़ंक्शन () {}) इसके बावजूद कि मान चर एक सरणी है, लेकिन हमारे पास अभी भी है इसे लपेटने के लिए []
अनह गुयेन

मौजूदा नोड- mysql पैकेज mysql पैकेज की तुलना में पूरी तरह से अलग सिंटैक्स है। नोड mysql पैकेज कड़ी है npmjs.com/package/node-mysql mysql पैकेज कड़ी है github.com/mysqljs/mysql#escaping-query-values
एग्नेल विशाल

2

कुछ चीजें जो मैं उल्लेख करना चाहता हूं वह यह है कि मैं अपने डेटाबेस के साथ संबंध बनाने के लिए mysql पैकेज का उपयोग कर रहा हूं और आपने जो नीचे देखा है वह कोड काम कर रहा है और सम्मिलित थोक क्वेरी के लिए लिखा गया है।

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

मुझे भी ऐसी ही समस्या हो रही थी। यह केवल सरणियों की सूची में से एक को सम्मिलित कर रहा था। नीचे के बदलाव करने के बाद इसने काम किया।

  1. क्वेरी पद्धति में [params] उत्तीर्ण।
  2. तालिका 1 मूल्यों में डालने (, बी) से क्वेरी को बदल दिया (?) ==> तालिका 1 मूल्यों में डालें (ए, बी)? । अर्थात। प्रश्न चिह्न के चारों ओर परिकल्पना को हटा दिया।

उम्मीद है की यह मदद करेगा। मैं mysql npm का उपयोग कर रहा हूं।


0

Node.js में बल्क इंसर्ट नीचे दिए गए कोड का उपयोग करके किया जा सकता है। मैंने इस काम को पाने के लिए बहुत सारे ब्लॉग का उल्लेख किया है।

कृपया इस लिंक को भी देखें। https://www.technicalkeeda.com/nodejs-tutorials/insert-multiple-records-into-mysql-using-nodejs

काम करने का कोड।

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

आशा है कि यह आपकी मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.