Symfoware

Symfowareについての考察blog

Node.js MySQLへのバルクインサートと、AUTO_INCREMENTで振られた値

Node.jsからMySQLに接続してみました。
Node.jsからMySQLに接続する

今回はバルクインサートを試してみます。


Nested arrays



https://www.npmjs.com/package/mysql
こちらをよく読んでみると、


Nested arrays are turned into grouped lists (for bulk inserts),
e.g. [['a', 'b'], ['c', 'd']] turns into ('a', 'b'), ('c', 'd')



なるほど、配列を渡せば目的は達成できそうです。
こんなプログラムを書いてみました。


  1. 'use strict'
  2. const mysql = require('mysql')
  3. // データベース接続
  4. const con = mysql.createConnection({
  5.     host     : '192.168.1.102',
  6.     user     : 'admin',
  7.     password : 'P@ssw0rd',
  8.     database : 'sample'
  9. })
  10. con.connect()
  11. // 登録用のデータ
  12. const values = [['データ1'], ['データ2'], ['データ3'], ['データ4']]
  13. // データの一括登録
  14. con.query('INSERT INTO test(value) VALUES ?', values, (err, results) => {
  15.     console.log(err)
  16.     console.log(results)
  17.     con.end()
  18. })



実行するとエラー


$ node index.js
{ Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''データ1'' at line 1
    at Query.Sequence._packetToError (/home/baranche/nodejs/mysql/node_modules/mysql/lib/protocol/sequences/Sequence.js:52:14)
    at Query.ErrorPacket (/home/baranche/nodejs/mysql/node_modules/mysql/lib/protocol/sequences/Query.js:77:18)
    at Protocol._parsePacket (/home/baranche/nodejs/mysql/node_modules/mysql/lib/protocol/Protocol.js:279:23)
    at Parser.write (/home/baranche/nodejs/mysql/node_modules/mysql/lib/protocol/Parser.js:76:12)
    at Protocol.write (/home/baranche/nodejs/mysql/node_modules/mysql/lib/protocol/Protocol.js:39:16)
    at Socket.<anonymous> (/home/baranche/nodejs/mysql/node_modules/mysql/lib/Connection.js:103:28)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
    at addChunk (_stream_readable.js:263:12)
    at readableAddChunk (_stream_readable.js:250:11)
    --------------------
    at Protocol._enqueue (/home/baranche/nodejs/mysql/node_modules/mysql/lib/protocol/Protocol.js:145:48)
    at Connection.query (/home/baranche/nodejs/mysql/node_modules/mysql/lib/Connection.js:208:25)
    at Object.<anonymous> (/home/baranche/nodejs/mysql/index.js:18:5)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:191:16)
code: 'ER_PARSE_ERROR',
errno: 1064,
sqlMessage: 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\'データ1\'\' at line 1',
sqlState: '42000',
index: 0,
sql: 'INSERT INTO test(value) VALUES \'データ1\'' }
undefined



何がまずいのかわからなかったのですが、以下のコードで動いてくれました。


  1. 'use strict'
  2. const mysql = require('mysql')
  3. // データベース接続
  4. const con = mysql.createConnection({
  5.     host     : '192.168.1.102',
  6.     user     : 'admin',
  7.     password : 'P@ssw0rd',
  8.     database : 'sample'
  9. })
  10. con.connect()
  11. // 登録用のデータ
  12. const values = [['データ1'], ['データ2'], ['データ3'], ['データ4']]
  13. // データの一括登録
  14. // リストを更にリストにする
  15. con.query('INSERT INTO test(value) VALUES ?', [values], (err, results) => {
  16.     console.log(err)
  17.     console.log(results)
  18.     con.end()
  19. })






バルクインサート時のAUTO_INCREMENT



バルクインサートした後、AUTO_INCREMENTで振られた番号をすぐに使用したい場合。
insertIdに、AUTO_INCREMENTで採番された最初の数値が入っています。

この数値から連番で番号が振られるため、
insertId + 登録した要素のインデックス
とすれば、各データの番号がわかります。


  1. 'use strict'
  2. const mysql = require('mysql')
  3. // データベース接続
  4. const con = mysql.createConnection({
  5.     host     : '192.168.1.102',
  6.     user     : 'admin',
  7.     password : 'P@ssw0rd',
  8.     database : 'sample'
  9. })
  10. con.connect()
  11. // 登録用のデータ
  12. const values = [['A'], ['B'], ['C'], ['D']]
  13. // データの一括登録
  14. // リストを更にリストにする
  15. con.query('INSERT INTO test(value) VALUES ?', [values], (err, results) => {
  16.     const firstid = results.insertId
  17.     con.end()
  18.     values.forEach((item, i) => {
  19.         console.log(item[0] + 'のidは' + (firstid + i))
  20.     })
  21. })



実行結果


$ node index.js
Aのidは9
Bのidは10
Cのidは11
Dのidは12



登録後のテーブルの内容


mysql> select * from test;
+----+--------------+
| id | value        |
+----+--------------+
| 1 | データ1     |
| 2 | データ2     |
| 3 | データ3     |
| 4 | データ4     |
| 5 | データ1     |
| 6 | データ2     |
| 7 | データ3     |
| 8 | データ4     |
| 9 | A            |
| 10 | B            |
| 11 | C            |
| 12 | D            |
+----+--------------+
12 rows in set (0.00 sec)



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2018/07/01(日) 17:08:24|
  2. node.js
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<AWS IoTにPythonでMQTTイベントの送信、受信するまで | ホーム | Node.jsからMySQLに接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
https://symfoware.blog.fc2.com/tb.php/2223-b4f90353
この記事にトラックバックする(FC2ブログユーザー)