सवाल मैं node.js का उपयोग कर mySQL में एक थोक सम्मिलन कैसे करूं?


कुछ ऐसा उपयोग करते समय मेरे एसक्यूएल में एक बड़ा डालने वाला कैसे होगा https://github.com/felixge/node-mysql


76
2018-01-17 18:33


मूल


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


जवाब:


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

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

आप केवल तत्वों का घोंसला वाला सरणी डालें।

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

var mysql = require('node-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 एक सरणी में लिपटे सरणी की एक सरणी है

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

174
2018-01-10 13:44



क्या यह वही सुरक्षा प्रदान करता है जो कर रहा है conn.execute() तैयार बयान का उपयोग करने के लिए? यदि नहीं, तो क्या आवेषण करते समय तैयार वक्तव्यों का उपयोग करना संभव है? धन्यवाद। - Vigs
हां, इस विधि से मूल्य बच गए हैं। मुझे लगता है कि यह तैयार बयान के समान तंत्र है, जो आंतरिक रूप से कनेक्शन.स्केप () का भी उपयोग करता है। - Ragnar123
यह मुझे भ्रमित कर रहा है। सरणी क्यों होनी चाहिए [[['ए', 'बी'], ['सी', 'डी']]] और [['ए', 'बी'], ['सी', 'डी ']] दस्तावेज की तरह कहते हैं? - Victorio Berra
विक्टोरियो बेरा, ऐसा इसलिए है क्योंकि बाहरीतम सरणी सामान्य रूप से कथन में एक मिलान प्रश्न चिह्न है, न केवल सम्मिलित है। उदाहरण के लिए, यदि आपके पास दो प्रश्न चिह्न प्लेसहोल्डर्स थे, तो आपके पास [param1, param2] होगा। "अद्यतन उपयोगकर्ता कहें? कहां आईडी =?", [कॉलम, आईडी] तो, कॉलम को पहले प्रश्न चिह्न और आईडी में दूसरे स्थान पर विस्तारित किया जाएगा। - Selay
दुर्भाग्य से यह जवाब मेरे लिए काम नहीं कर रहा है। मैंने सचमुच आपके उत्तर की प्रतिलिपि बनाई लेकिन बिना किसी सफलता के। मैंने एक और सवाल पोस्ट किया stackoverflow.com/questions/41170849/... - Ivan Pandžić


मैं अभी तक टिप्पणी करने में असमर्थ हूं, इसलिए उत्तर सबमिट करूंगा।

@ 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] विधि में

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


9
2018-05-16 05:27



हाँ, किसी कारण से इसे सरणी की सरणी की सरणी होना चाहिए ... - Joe


अपने जवाब के लिए Ragnar123 के सभी समर्थक।

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

ये अनुक्रमिक होंगे। यह जवाब देखें: क्या एक MySQL मल्टी-पंक्ति डालने अनुक्रमिक autoincrement आईडी पकड़ता है?

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

(मैंने वस्तुओं की एक सरणी से मूल्य खींचा जिन्हें मैंने लगातार ऑब्जेक्ट कहा था।)

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


5
2017-12-29 02:24



क्या हम गारंटी देते हैं कि एक साथ आवेषण के मामले में दौड़ की स्थिति मिश्रण डालने के मिश्रण नहीं होगी? - Purefan
@Purefan मेरे परीक्षणों के अनुसार हाँ, हालांकि कौन जानता है कि यह कभी बदल जाएगा। - thewormsterror
ध्यान दें, यह केवल तभी काम करेगा यदि auto_increment चरण का आकार उसके मूल मान पर है 1. देखें dev.mysql.com/doc/refman/5.7/en/... - luksch


यदि यहां आवश्यक है तो हम सरणी डालने का हल कैसे करते हैं

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

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

3
2018-02-22 20:38





मैं थोक डालने वाले ऑब्जेक्ट्स पर एक उत्तर के लिए चारों ओर देख रहा था।

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

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

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


3
2017-08-03 22:41





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

उम्मीद है कि यह किसी की मदद करता है।


1
2018-02-08 00:31



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


मुझे एक ही समस्या थी। यह सिर्फ सरणी की सूची से एक डालने वाला था। यह नीचे परिवर्तन करने के बाद काम किया।

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

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


0
2018-03-06 16:11