Https://github.com/felixge/node-mysql এর মতো কিছু ব্যবহার করা হলে কেউ মাইএসকিউএল তে কীভাবে একটি বাল্ক সন্নিবেশ করায়?
Https://github.com/felixge/node-mysql এর মতো কিছু ব্যবহার করা হলে কেউ মাইএসকিউএল তে কীভাবে একটি বাল্ক সন্নিবেশ করায়?
উত্তর:
নেস্টেড অ্যারে ব্যবহার করে বাল্ক সন্নিবেশগুলি সম্ভব, গিথুব পৃষ্ঠাটি দেখুন
নেস্টেড অ্যারেগুলি গোষ্ঠীভুক্ত তালিকায় পরিণত হয় (বাল্ক সন্নিবেশের জন্য), যেমন
[['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একটি অ্যারেতে আবৃত অ্যারেগুলির একটি অ্যারে
[ [ [...], [...], [...] ] ]
বাল্ক সন্নিবেশের জন্য একটি সম্পূর্ণ আলাদা নোড-এমএসকিএল প্যাকেজও রয়েছে
conn.execute()প্রস্তুত বিবৃতি ব্যবহার করার মতো একই সুরক্ষা সরবরাহ করে ? যদি তা না হয়, সন্নিবেশ করার সময় কি প্রস্তুত বিবৃতি ব্যবহার করা সম্ভব? ধন্যবাদ।
@ রাগনার 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]পদ্ধতির মত পাস করা প্রয়োজন।
?পরিবর্তে এটির জন্য একটি একক প্রয়োজন ??।
আমি বাল্ক সন্নিবেশকারী বস্তুগুলির জন্য একটি উত্তর খুঁজছিলাম।
রাগনার 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);
});
আশা করি এটা সাহায্য করবে!
আমি আজ এটিতে ছুটে এসেছি ( 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) => {...}
);
সমস্ত উত্তর তার উত্তর জন্য 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);
});
(আমি বস্তুর একটি অ্যারে থেকে মানগুলি টানলাম যা আমি পার্সেন্টিওবজেক্টস বলেছি))
আশাকরি এটা সাহায্য করবে.
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);
?পরে রাখার চাবিকাঠিটি VALUES। এইভাবে কলামের অ্যারের অ্যারেটি স্বয়ংক্রিয়ভাবে বাল্ক সন্নিবেশগুলিতে প্রক্রিয়া করা যায়। এটি মাইএসকিউএল-এ অ্যাক্সেস লগের কয়েকশ মেগাবাইট বিশ্লেষণ করতে ব্যবহৃত হয়েছিল।
আমাদের এখানে অ্যারের সন্নিবেশ সমাধান করার পদ্ধতিটি এখানে দরকার
অনুরোধ পোস্টম্যানের পক্ষ থেকে (আপনি "অতিথিদের" দেখবেন)
{
"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;
};
যদি Ragnarউত্তরটি আপনার পক্ষে কাজ করে না। সম্ভবত এখানে (আমার অভিজ্ঞতার ভিত্তিতে) -
আমার node-mysqlহিসাবে প্রদর্শিত প্যাকেজটি আমি ব্যবহার করছিলাম না Ragnar। আমি mysqlপ্যাকেজ ব্যবহার করছিলাম । এগুলি আলাদা (যদি আপনি লক্ষ্য না করেন - ঠিক আমার মতো) তবে আমি নিশ্চিত না যে এটির সাথে ?কাজ করার কোনও সম্পর্ক আছে কিনা , যেহেতু এটি mysqlপ্যাকেজটি ব্যবহার করে অনেক লোকের পক্ষে কাজ করেছিল বলে মনে হয়েছিল ।
পরিবর্তে একটি চলক ব্যবহার করার চেষ্টা করুন ?
নিম্নলিখিত আমার জন্য কাজ করেছে -
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();
});
আশা করি এটি কাউকে সাহায্য করবে।
আমি যে কয়েকটি জিনিস উল্লেখ করতে চাই তা হ'ল আমি আমার ডাটাবেসের সাথে সংযোগ স্থাপনের জন্য মাইএসকিএল প্যাকেজটি ব্যবহার করছি এবং আপনি নীচে যা দেখেছেন তা কার্যকরী কোড এবং সন্নিবেশ বাল্ক ক্যোয়ারির জন্য লেখা আছে।
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)
});
আমি একই সমস্যা ছিল। এটি অ্যারের তালিকা থেকে একটি সন্নিবেশ করছিল। এটি নীচের পরিবর্তনগুলি করার পরে কাজ করে।
আশাকরি এটা সাহায্য করবে. আমি মাইএসকিএল এনপিএম ব্যবহার করছি।
নোড.জেজে বাল্ক সন্নিবেশ নীচের কোডটি ব্যবহার করে করা যেতে পারে। এই কাজটি পাওয়ার জন্য আমি প্রচুর ব্লগ উল্লেখ করেছি।
এছাড়াও এই লিঙ্কটি উল্লেখ করুন। 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);
});
আশা করি এটা তোমাকে সাহায্য করবে।