আমি কীভাবে নোড.জেএস ব্যবহার করে মাইএসকিউএল এ বাল্ক সন্নিবেশ করব


123

Https://github.com/felixge/node-mysql এর মতো কিছু ব্যবহার করা হলে কেউ মাইএসকিউএল তে কীভাবে একটি বাল্ক সন্নিবেশ করায়?


সমস্যা কি? আপনি কি এটি একই স্কেল কমান্ডের মতো করতে পারবেন? পূর্ববর্তী সম্পূর্ণ হয়ে গেলে পরবর্তী কমান্ডটি শুরু করুন যতক্ষণ না আপনি সমস্ত ডেটা sertedোকান।
আন্দ্রে সিডোরভ

3
আমি এই ছাপে ছিলাম যে বাল্ক সন্নিবেশগুলি বহু একক সন্নিবেশকারীর চেয়ে দ্রুত।
ক্রিকেটাররা

তারের স্তরে তারা একই।
মাইএসকিএল

1
মাইএসকিউএলে একাধিক inোকানো আছে, আপনি কেবল ভ্যালু কীওয়ার্ডটি ব্যবহার করেন। dev.mysql.com/doc/refman/5.5/en/insert.html VALUES সিনট্যাক্স ব্যবহার করা INSERT স্টেটমেন্টগুলি একাধিক সারি সন্নিবেশ করতে পারে। এটি করার জন্য, কলাম মানগুলির একাধিক তালিকাগুলি অন্তর্ভুক্ত করুন, প্রত্যেকটি বন্ধনীতে আবদ্ধ এবং কমা দ্বারা পৃথক। উদাহরণ: tbl_name INSERT INTO (a, b, c) ভ্যালু (1,2,3), (4,5,6), (7,8,9);
ক্রিকেট

উত্তর:


288

নেস্টেড অ্যারে ব্যবহার করে বাল্ক সন্নিবেশগুলি সম্ভব, গিথুব পৃষ্ঠাটি দেখুন

নেস্টেড অ্যারেগুলি গোষ্ঠীভুক্ত তালিকায় পরিণত হয় (বাল্ক সন্নিবেশের জন্য), যেমন [['a', 'b'], ['c', 'd']]পরিবর্তিত হয়('a', 'b'), ('c', 'd')

আপনি কেবল উপাদানগুলির নেস্টেড অ্যারে sertোকান।

একটি উদাহরণ দেওয়া হয় এখানে

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()প্রস্তুত বিবৃতি ব্যবহার করার মতো একই সুরক্ষা সরবরাহ করে ? যদি তা না হয়, সন্নিবেশ করার সময় কি প্রস্তুত বিবৃতি ব্যবহার করা সম্ভব? ধন্যবাদ।
Vigs

2
হ্যাঁ, মানগুলি এই পদ্ধতিতে পালিয়ে যায়। আমি মনে করি এটি প্রস্তুত বিবৃতি হিসাবে একই ব্যবস্থা, যা অভ্যন্তরীণভাবে সংযোগ.সেস্কেপ () ব্যবহার করে।
রাগনার 123

7
এটি আমার কাছে বিভ্রান্তিকর। অ্যারেটি [[['' ',' বি '], [' সি ',' ডি ']]] এবং কেন [[' '' ',' বি '], [' সি ',' ডি হতে হবে না? ']] ডকুমেন্টেশন বলে কি?
ভিক্টোরিও বেরেরা

12
ভিক্টোরিও বেররা, কারণ বাইরেরতম অ্যারেটি সাধারণভাবে বিবৃতিতে একের সাথে মিলে যায় এমন প্রশ্ন চিহ্ন, কেবল সন্নিবেশে নয়। উদাহরণস্বরূপ, আপনার যদি দুটি প্রশ্ন চিহ্ন স্থানধারক থাকে তবে আপনার [প্যারাম 1, প্যারাম 2] থাকতে হবে। "আপডেটের ব্যবহারকারীগণ? কোথায় আইডি =?", [কলাম, আইডি] বলুন তো, কলামগুলি প্রথম প্রশ্ন চিহ্ন এবং দ্বিতীয়টিতে আইডিতে প্রসারিত হবে।
Selay

3
দুর্ভাগ্যক্রমে এই উত্তরটি আমার পক্ষে কাজ করছে না। আমি আপনার উত্তরটি আক্ষরিক অনুলিপি করেছিলাম তবে কোনও সাফল্য পাইনি। আমি
স্ট্যাকওভারফ্লো.com/

19

@ রাগনার 123 উত্তর সঠিক, তবে আমি প্রচুর লোক মন্তব্যগুলিতে বলছে যে এটি কাজ করছে না। আমারও একই সমস্যা ছিল এবং মনে হচ্ছে আপনার নিজের অ্যারেটি এইভাবে মোড়ানো দরকার []:

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

আমি বাল্ক সন্নিবেশকারী বস্তুগুলির জন্য একটি উত্তর খুঁজছিলাম।

রাগনার 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);
});

আশা করি এটা সাহায্য করবে!


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
আমি আপনার সমাধানটি পছন্দ করি
জো

এই সমাধানটি আমার পক্ষে কাজ করেছিল! TY! পোস্টম্যান: [{"টেক্সটকিউশনবিল্ডারআইডি": "5", "প্রার্থীআইডি": "এবিসি 123", "ফলাফলনির্বাচিত": "এসএফঘি" {, text "টেক্সটকিউশনবিল্ডারআইডি": "6", "প্রার্থীআইডি": "এবিসি 123", "ফলাফল নির্বাচিত": "sfgh"}, {"textQuestionBuilderID": "7", "প্রার্থীআইডি": "ABC123", "ফলাফলনির্বাচিত": "sfgh"}, text "textQuestionBuilderID": "8", "उम्मीदवारআইডি": "এবিসি 123", "ফলাফল নির্বাচিত ":" sfgh ""]
ব্রায়ান

8

সমস্ত উত্তর তার উত্তর জন্য Ragnar123।

জোশ হারিংটনের inোকানো আইডি সম্পর্কে কথা বলার প্রশ্নের পরে আমি কেবল এটি প্রসারিত করতে চেয়েছিলাম।

এগুলি অনুক্রমিক হবে। এই উত্তরটি দেখুন: একটি মাইএসকিউএল বহু-সারি সন্নিবেশযুক্ত ক্রমবর্ধমান স্বতঃসংশোধন আইডিগুলি সন্ধান করে?

সুতরাং আপনি কেবল এটি করতে পারেন (ফলাফল.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);
  });

(আমি বস্তুর একটি অ্যারে থেকে মানগুলি টানলাম যা আমি পার্সেন্টিওবজেক্টস বলেছি))

আশাকরি এটা সাহায্য করবে.


আমরা কি নিশ্চিত যে যুগপত সন্নিবেশ ক্ষেত্রে রেস শর্তটি আইডস মিশ্রিত না?
খাঁটিfan

1
@ শুদ্ধান আমার পরীক্ষাগুলি অনুসারে হ্যাঁ, তবে কে কখনও জানে যে এটি কখনও পরিবর্তন হবে কিনা।
ওয়ার্মস্টেরার

দ্রষ্টব্য, যে কেবলমাত্র অটো_সংশোধন পদক্ষেপের আকারটি 1 এর মূল মানের উপরে থাকলে এটি কাজ করবে dev dev.mysql.com/doc/refman/5.7/en/…
luksch

6

Node.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। এইভাবে কলামের অ্যারের অ্যারেটি স্বয়ংক্রিয়ভাবে বাল্ক সন্নিবেশগুলিতে প্রক্রিয়া করা যায়। এটি মাইএসকিউএল-এ অ্যাক্সেস লগের কয়েকশ মেগাবাইট বিশ্লেষণ করতে ব্যবহৃত হয়েছিল।
অ্যালেক্স পাক্কা

আমি বুঝতে পারিনি কেন আপনি এটিকে পরীক্ষা না করা অবধি এই অংশগুলিতে ভাগ করছেন। সময়মতো ফ্যাশনে সার্ভারের জন্য আমার সন্নিবেশটি খুব বড় হয়ে যায় এবং আমি একটি EPIPE ত্রুটি পেয়েছি। খণ্ডগুলি সন্নিবেশ করানো ঠিক করে দেয়। :)
কিট পিটারস

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

আশা করি এটি কাউকে সাহায্য করবে।


আমি মনে করি আপনি []] মানগুলিতে রাখতে ভুলে যেতে পারেন। এটা খুবই আমাকে ঘটেছে। এটি হওয়া উচিত: conn.query (sql, [মান], ফাংশন () {}) এর পরিবর্তে: conn.query (sQL, মান, ফাংশন () {}) সত্ত্বেও মান ভেরিয়েবল একটি অ্যারে হয়, তবে আমাদের এখনও আছে এটিকে মোড়ানোর জন্য []
আনহ

বর্তমান নোড-মাইএসকিএল প্যাকেজটিতে মাইএসকিএল প্যাকেজের তুলনায় সম্পূর্ণ আলাদা সিনট্যাক্স রয়েছে। নোড- মাইএসকিএল প্যাকেজ লিঙ্কটি হল এনপিএমজেএস.com /package /node-mysql মাইএসকিএল প্যাকেজ লিঙ্কটি github.com/mysqljs/mysql#escaping-query-values
বিশাল

2

আমি যে কয়েকটি জিনিস উল্লেখ করতে চাই তা হ'ল আমি আমার ডাটাবেসের সাথে সংযোগ স্থাপনের জন্য মাইএসকিএল প্যাকেজটি ব্যবহার করছি এবং আপনি নীচে যা দেখেছেন তা কার্যকরী কোড এবং সন্নিবেশ বাল্ক ক্যোয়ারির জন্য লেখা আছে।

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. [প্যারামগুলি] ক্যোয়ারী পদ্ধতিতে পাস করেছে।
  2. সারণি (ক, খ) থেকে সারণী 1 মানগুলিতে (?) ==> সারণি (ক, খ) কে টেবিল 1 মানগুলিতে পরিবর্তন করেছেন? । অর্থাত। প্রশ্ন চিহ্নের চারপাশে প্যারানথেসিস সরিয়ে ফেলা হয়েছে।

আশাকরি এটা সাহায্য করবে. আমি মাইএসকিএল এনপিএম ব্যবহার করছি।


0

নোড.জেজে বাল্ক সন্নিবেশ নীচের কোডটি ব্যবহার করে করা যেতে পারে। এই কাজটি পাওয়ার জন্য আমি প্রচুর ব্লগ উল্লেখ করেছি।

এছাড়াও এই লিঙ্কটি উল্লেখ করুন। 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);
  });

আশা করি এটা তোমাকে সাহায্য করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.