programing

node.js를 사용하여 mySQL에 대량 삽입하려면 어떻게 해야 합니까?

copyandpastes 2022. 10. 19. 21:35
반응형

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님의 답변이 적절하지 않습니다.(내 경험에 비추어) 다음과 같은 이유가 있을 것이다.

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

이게 도움이 됐으면 좋겠네요.

여기서 필요한 것이 어레이 삽입을 해결하는 방법인 경우

요청은 우체부로부터 ('게스트'를 참조합니다)

 {
  "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;
};

저도 비슷한 문제가 있었어요.배열 목록에서 하나를 삽입한 것뿐입니다.아래와 같이 변경 후 동작했습니다.

  1. [params]를 쿼리 메서드로 전달했습니다.
  2. 쿼리를 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

반응형