Bagaimana seseorang melakukan penyisipan massal ke mySQL jika menggunakan sesuatu seperti https://github.com/felixge/node-mysql
Bagaimana seseorang melakukan penyisipan massal ke mySQL jika menggunakan sesuatu seperti https://github.com/felixge/node-mysql
Jawaban:
Penyisipan massal dimungkinkan dengan menggunakan array bersarang, lihat halaman github
Array bersarang diubah menjadi daftar yang dikelompokkan (untuk sisipan massal), misalnya
[['a', 'b'], ['c', 'd']]
berubah menjadi('a', 'b'), ('c', 'd')
Anda cukup menyisipkan larik elemen bersarang.
Contoh diberikan di sini
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();
});
Catatan: values
adalah larik larik yang dibungkus dalam larik
[ [ [...], [...], [...] ] ]
Ada juga paket node-msql yang sangat berbeda untuk penyisipan massal
conn.execute()
penggunaan pernyataan yang disiapkan? Jika tidak, apakah mungkin untuk menggunakan pernyataan yang telah disiapkan saat melakukan penyisipan? Terima kasih.
@ Ragnar123 Jawaban benar, tetapi saya melihat banyak orang mengatakan di komentar bahwa itu tidak berfungsi. Saya memiliki masalah yang sama dan sepertinya Anda perlu membungkus array Anda []
seperti ini:
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]
];
Itu perlu diteruskan seperti [pars]
ke dalam metode.
?
bukan ??
untuk mendapatkan pengelompokan yang benar.
Saya mencari-cari jawaban untuk memasukkan Object secara massal.
Jawaban oleh Ragnar123 membuat saya membuat fungsi ini:
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);
});
Semoga membantu!
Saya bertemu hari ini ( mysql 2.16.0) dan berpikir saya akan membagikan solusi saya:
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) => {...}
);
Semua alat peraga untuk Ragnar123 untuk jawabannya.
Saya hanya ingin mengembangkannya setelah pertanyaan yang diajukan oleh Josh Harington untuk membicarakan tentang ID yang dimasukkan.
Ini akan berurutan. Lihat jawaban ini: Apakah penyisipan multi-baris MySQL mengambil ID autoincrement berurutan?
Karenanya Anda bisa melakukan ini (perhatikan apa yang saya lakukan dengan 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);
});
(Saya menarik nilai dari array objek yang saya sebut persistentObjects.)
Semoga ini membantu.
Ini adalah potongan "raw-copy-paste" yang cepat untuk mendorong kolom file di mysql dengan node.js> = 11
250k baris dalam beberapa detik
'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);
?
setelahnya VALUES
, tanpa tanda kurung apa pun. Dengan cara ini, susunan larik kolom dapat diproses secara otomatis dalam sisipan massal. Digunakan untuk menganalisis ratusan megabyte log akses di MySQL.
Dalam hal yang dibutuhkan di sini adalah bagaimana kita menyelesaikan penyisipan array
permintaan dari tukang pos (Anda akan melihat "tamu")
{
"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]
}
Dan bagaimana kami membuat naskah
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
Jawaban If tidak berhasil untuk Anda. Ini mungkin alasannya (berdasarkan pengalaman saya) -
Saya tidak menggunakan node-mysql
paket seperti yang ditunjukkan pada saya Ragnar
. Saya menggunakan mysql
paket. Mereka berbeda (jika Anda tidak menyadarinya - seperti saya). Tapi saya tidak yakin apakah itu ada hubungannya dengan ?
tidak berfungsi, karena tampaknya berhasil untuk banyak orang yang menggunakan mysql
paket tersebut.
Coba gunakan variabel, bukan ?
Berikut ini berhasil untuk saya -
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();
});
Semoga ini bisa membantu seseorang.
Beberapa hal yang ingin saya sebutkan adalah bahwa saya menggunakan paket mysql untuk membuat koneksi dengan database saya dan apa yang Anda lihat di bawah ini adalah kode yang berfungsi dan ditulis untuk memasukkan kueri massal.
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)
});
Saya mengalami masalah serupa. Itu hanya memasukkan satu dari daftar array. Ini berfungsi setelah melakukan perubahan di bawah ini.
Semoga ini membantu. Saya menggunakan mysql npm.
Penyisipan massal di Node.js dapat dilakukan menggunakan kode di bawah ini. Saya telah merujuk banyak blog untuk mendapatkan pekerjaan ini.
silakan lihat tautan ini juga. https://www.technicalkeeda.com/nodejs-tutorials/insert-multiple-records-into-mysql-using-nodejs
Kode kerja.
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);
});
Semoga ini bisa membantu Anda.