Https://github.com/felixge/node-mysql gibi bir şey kullanılıyorsa, mySQL'e toplu ekleme nasıl yapılır?
Https://github.com/felixge/node-mysql gibi bir şey kullanılıyorsa, mySQL'e toplu ekleme nasıl yapılır?
Yanıtlar:
İç içe dizi kullanılarak toplu eklemeler mümkündür, github sayfasına bakın
İç içe diziler, (kütle parçaları için) gruplandırılmış listeler halinde, örneğin getirilir
[['a', 'b'], ['c', 'd']]içine döner('a', 'b'), ('c', 'd')
Yalnızca iç içe geçmiş bir öğe dizisi eklersiniz.
Bir örnek verilmiştir burada
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();
});
Not: valuesbir dizi içine sarılmış bir dizi dizisidir
[ [ [...], [...], [...] ] ]
Toplu ekleme için tamamen farklı bir node-msql paketi de var
conn.execute()hazırlanmış ifadeleri kullanmakla aynı korumaları sağlıyor mu ? Değilse, ekler yaparken hazırlanmış ifadelerden yararlanmak mümkün müdür? Teşekkürler.
@ Ragnar123 yanıtı doğru, ancak yorumlarda işe yaramadığını söyleyen birçok insan görüyorum. Aynı sorunu yaşadım ve dizinizi şu şekilde sarmalamanız gerekiyor gibi görünüyor []:
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]
];
Metoda olduğu gibi geçilmesi gerekiyor [pars].
?yerine tekil olması gerektiği gibi görünüyor ??.
Nesneleri toplu olarak ekleme konusunda bir cevap arıyordum.
Ragnar123'ün cevabı beni bu işlevi yapmaya yönlendirdi:
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);
});
Umarım yardımcı olur!
Bugün bununla karşılaştım ( mysql 2.16.0) ve çözümümü paylaşacağımı düşündüm:
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) => {...}
);
Hepsi cevabı için Ragnar123'ü destekliyor.
Josh Harington tarafından eklenen kimlikler hakkında konuşmak için sorulan sorudan sonra genişletmek istedim.
Bunlar sıralı olacaktır. Şu yanıta bakın: MySQL çok sıralı eklenti sıralı otomatik artış kimlikleri alır mı?
Dolayısıyla, bunu yapabilirsiniz (result.insertId ile ne yaptığıma dikkat edin):
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);
});
(KalıcıObjects adını verdiğim bir dizi nesneden değerleri çektim.)
Bu yardımcı olur umarım.
Bu, node.js> = 11 ile mysql'de bir dosya sütununu aktarmak için kırpılan hızlı bir "ham kopyala-yapıştır" tır.
Birkaç saniyede 250 bin satır
'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);
?sonradan saklamaktır VALUES. Bu şekilde, sütun dizileri otomatik olarak toplu eklemelerde işlenebilir. MySQL'de yüzlerce megabaytlık erişim günlüğünü analiz etmek için kullandı.
Burada gerekli olması durumunda, dizi eklemeyi nasıl çözdük
postacıdan istek ("misafirlere" bakacaksınız)
{
"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]
}
Ve nasıl senaryo yazdık
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;
};
Eğer Ragnarbireyin cevabı sizin için çalışmaz. Muhtemelen nedeni budur (deneyimlerime dayanarak) -
node-mysqlPaketi gösterildiği gibi kullanmıyordum Ragnar. mysqlPaket kullanıyordum . Farklılar (fark etmediyseniz - tıpkı benim gibi). Ancak ?, mysqlpaketi kullanan birçok kişi için işe yaradığı için çalışmamayla bir ilgisi olup olmadığından emin değilim .
Yerine bir değişken kullanmayı deneyin ?
Aşağıdakiler benim için çalıştı -
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();
});
Umarım bu birine yardımcı olur.
Bahsetmek istediğim birkaç şey, veritabanımla bağlantı kurmak için mysql paketini kullanıyorum ve aşağıda gördüğünüz kodun çalışıyor olması ve toplu sorgu eklemek için yazılmış olmasıdır.
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)
});
Ben de benzer bir sorun yaşıyordum. Diziler listesinden bir tane ekliyordu. Aşağıdaki değişiklikleri yaptıktan sonra çalıştı.
Bu yardımcı olur umarım. Mysql npm kullanıyorum.
Node.js'de toplu ekleme aşağıdaki kod kullanılarak yapılabilir. Bu işi almak için birçok bloga atıfta bulundum.
lütfen bu bağlantıya da bakın. https://www.technicalkeeda.com/nodejs-tutorials/insert-multiple-records-into-mysql-using-nodejs
Çalışma kodu.
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);
});
Umarım bu sana yardımcı olur.