node.js를 사용하여 mySQL에 대량 삽입하려면 어떻게 해야 합니까?
https://github.com/felixge/node-mysql 같은 것을 사용하는 경우 mySQL에 대량 삽입하는 방법은 무엇입니까?
중첩된 어레이를 사용하여 대량 삽입할 수 있습니다(github 페이지 참조).
네스트된 배열은 그룹화된 목록(벌크 삽입용)으로 변환됩니다.
[['a', 'b'], ['c', 'd']]
로 바뀌다('a', 'b'), ('c', 'd')
요소의 중첩 배열을 삽입하기만 하면 됩니다.
여기에 예를 제시하겠습니다.
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
어레이로 둘러싸인 어레이입니다.
[ [ [...], [...], [...] ] ]
벌크 삽입용 node-msql 패키지도 전혀 다릅니다.
오늘 우연히 (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의 답변은 맞지만, 많은 분들이 댓글로 '안 된다'고 하시네요.저도 같은 문제가 있었습니다만, 어레이를 정리할 필요가 있는 것 같습니다.[]
다음과 같습니다.
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]
메서드에 포함시킵니다.
오브젝트 대량 삽입에 대한 답변을 찾고 있었습니다.
Ragnar123의 답변에 따라 저는 다음과 같은 기능을 갖게 되었습니다.
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);
});
도움이 됐으면 좋겠다!
모든 소품을 라그나123에게 바칩니다
삽입 ID에 대해 Josh Harington의 질문을 받고 확장해 보고 싶었습니다.
이것들은 순차적으로 됩니다.다음 답변 참조: MySQL 다중 행 삽입은 순차적 자동 증가 ID를 잡습니까?
따라서 이 작업을 수행할 수 있습니다(결과에 대해 수행한 작업에 유의하십시오.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);
});
(persistentObjects라고 하는 오브젝트 배열에서 값을 꺼냈습니다).
이게 도움이 됐으면 좋겠다.
이것은 mysql 내의 파일 열을 node.discopy > = 11에서 푸시하기 위해 빠르게 캡처된 "raw-copy-discapy"입니다.
몇 초 만에 25만 행 실현
'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);
한다면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();
});
이게 도움이 됐으면 좋겠네요.
여기서 필요한 것이 어레이 삽입을 해결하는 방법인 경우
요청은 우체부로부터 ('게스트'를 참조합니다)
{
"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;
};
저도 비슷한 문제가 있었어요.배열 목록에서 하나를 삽입한 것뿐입니다.아래와 같이 변경 후 동작했습니다.
- [params]를 쿼리 메서드로 전달했습니다.
- 쿼리를 insert (a,b)에서 table1 values (?)로 변경 ==> insert (a,b)를 table1 values ?로 변경.물음표 주위의 파라테지스를 제거했다.
이게 도움이 됐으면 좋겠다.mysql npm을 사용하고 있습니다.
몇 가지 언급하고 싶은 것은 데이터베이스와의 접속에 mysql 패키지를 사용하고 있다는 것입니다.아래에 보이는 것은 작업 코드이며, 벌크 쿼리를 삽입하기 위해 작성된 것입니다.
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)
});
다음 코드를 사용하여 Node.js에 일괄 삽입할 수 있습니다.나는 이 일을 얻기 위해 많은 블로그를 참고했다.
이 링크도 참조해 주세요.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);
});
이게 도움이 되길 바라.
개체를 삽입하려면 다음을 사용합니다.
currentLogs = [
{ socket_id: 'Server', message: 'Socketio online', data: 'Port 3333', logged: '2014-05-14 14:41:11' },
{ socket_id: 'Server', message: 'Waiting for Pi to connect...', data: 'Port: 8082', logged: '2014-05-14 14:41:11' }
];
console.warn(currentLogs.map(logs=>[ logs.socket_id , logs.message , logs.data , logs.logged ]));
출력은 다음과 같습니다.
[
[ 'Server', 'Socketio online', 'Port 3333', '2014-05-14 14:41:11' ],
[
'Server',
'Waiting for Pi to connect...',
'Port: 8082',
'2014-05-14 14:41:11'
]
]
또한 지도 기능에 대한 자세한 내용은 설명서를 참조하십시오.
Client.createClient = (clientReqData, result) =>{
var command = 'INSERT INTO client (name,email,phone,country_code,city,state,address,salaes_account_manager,internal_notes) VALUES (?,?,?,?,?,?,?,?,?)' ;
dbConn.query(command,[clientReqData.name,
clientReqData.email,clientReqData.phone,clientReqData.country_code,clientReqData.city,clientReqData.state,clientReqData.address,clientReqData.salaes_account_manager,clientReqData.internal_notes],(err,res)=>{
if(err){
console.log(err)
}else {
client_id = res.insertId;
var command = 'INSERT INTO client_contact_person (name, email ,phone,client_id) VALUES ?';
dbConn.query(command,
[clientReqData.contact.map(item => [item.name, item.email, item.phone,client_id])],
(err, res) => {
if(err) throw err
}
);
result(null,res);
}
})
}
언급URL : https://stackoverflow.com/questions/8899802/how-do-i-do-a-bulk-insert-in-mysql-using-node-js
'programing' 카테고리의 다른 글
라이브러리가 로드되지 않음: mysql2 gem을 사용하여 OS X 10.6에서 'rails server'를 실행하려고 하면 libmysqlclient.16.dylib 오류가 발생함 (0) | 2022.10.19 |
---|---|
JavaScript에서 setInterval 호출 중지 (0) | 2022.10.19 |
각 콜백의 모든 비동기 후 콜백 (0) | 2022.10.19 |
새 폴더 작성 방법 (0) | 2022.10.19 |
JavaScript는 붙여넣기 이벤트에서 클립보드 데이터를 가져옵니다(크로스 브라우저). (0) | 2022.10.19 |