質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1197閲覧

node.js使用して、web3.eth.getBlockで取得したデータをmysqlに書き込めない。

pierogi.user

総合スコア19

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/11/28 07:27

編集2019/11/28 07:40

実現したいこと

node.js使用して、web3.eth.getBlockで取得したデータをmysqlに書き込みたいです。

発生している問題

mysqlへの書き込みが上手くいきません。

コード

Javascript

1let mysql = require('mysql'); 2const Web3 = require('web3'); 3 4const web3 = new Web3("http://localhost:8545"); 5 6const mysqlConnect = mysql.createConnection({ 7 host: 'localhost', 8 user: 'webstorm', 9 password: '', 10 database: 'blockchain_data', 11}); 12 13let TABLE_NAME = 'eth_blockdata'; 14 15async function geth2db() { 16 17 let i = 9000000; 18 let blockInfo = {}; 19 let block2obj = {}; 20 let transactions_join = ''; 21 22 try { 23 blockInfo = await web3.eth.getBlock(i); 24 25 transactions_join = blockInfo.transactions.join(); 26 27 block2obj = { 28 number: blockInfo.number, 29 difficulty: blockInfo.difficulty, 30 extraData: blockInfo.extraData, 31 gasLimit: blockInfo.gasLimit, 32 gasUsed: blockInfo.gasUsed, 33 hash: blockInfo.hash, 34 logsBloom: blockInfo.logsBloom, 35 miner: blockInfo.miner, 36 mixHash: blockInfo.mixHash, 37 nonce:blockInfo.nonce, 38 parentHash: blockInfo.parentHash, 39 receiptsRoot: blockInfo.redeiptsRoot, 40 sha3Uncles: blockInfo.sha3Uncles, 41 size: blockInfo.size, 42 stateRoot: blockInfo.stateRoot, 43 timestamp: blockInfo.timestamp, 44 totalDifficulty: blockInfo.totalDifficulty, 45 transactions: transactions_join, 46 transactionsRoot: blockInfo.transactionRoot, 47 uncles: blockInfo.uncles, 48 }; 49 50 await mysqlConnect.query('INSERT INTO ' + TABLE_NAME + ' SET ?', block2obj, (err, res) => { 51 if (err) throw err; 52 }); 53 54 console.log(blockInfo); 55 } catch (e) { 56 throw e; 57 } 58 59} 60

###mysqlテーブル構成

+------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------+--------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | number | int(11) | YES | | NULL | | | difficulty | varchar(255) | YES | | NULL | | | extraData | varchar(255) | YES | | NULL | | | gasLimit | int(11) | YES | | NULL | | | gasUsed | int(11) | YES | | NULL | | | hash | varchar(255) | YES | | NULL | | | logsBloom | text | YES | | NULL | | | miner | varchar(255) | YES | | NULL | | | mixHash | varchar(255) | YES | | NULL | | | nonce | varchar(255) | YES | | NULL | | | parentHash | varchar(255) | YES | | NULL | | | receiptsRoot | varchar(255) | YES | | NULL | | | sha3Uncles | varchar(255) | YES | | NULL | | | size | int(11) | YES | | NULL | | | stateRoot | varchar(255) | YES | | NULL | | | timestamp | int(11) | YES | | NULL | | | totalDifficulty | varchar(255) | YES | | NULL | | | transactions | text | YES | | NULL | | | transactionsRoot | varchar(255) | YES | | NULL | | | uncles | varchar(255) | YES | | NULL | | +------------------+--------------+------+-----+---------+-------+

###エラーメッセージ

/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/protocol/Parser.js:437 throw err; // Rethrow non-MySQL errors ^ 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 '' at line 1 at Query.Sequence._packetToError (/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14) at Query.ErrorPacket (/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/protocol/sequences/Query.js:77:18) at Protocol._parsePacket (/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/protocol/Protocol.js:291:23) at Parser._parsePacket (/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/protocol/Parser.js:433:10) at Parser.write (/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/protocol/Parser.js:43:10) at Protocol.write (/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/protocol/Protocol.js:38:16) at Socket.<anonymous> (/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/Connection.js:91:28) at Socket.<anonymous> (/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/Connection.js:525:10) at Socket.emit (events.js:210:5) at addChunk (_stream_readable.js:326:12) -------------------- at Protocol._enqueue (/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/protocol/Protocol.js:144:48) at Connection.query (/Users/user/Documents/WebStorm project/191112/node_modules/mysql/lib/Connection.js:201:25) at geth2db (/Users/user/Documents/WebStorm project/191112/sub_app/block2mysql.js:71:28) at processTicksAndRejections (internal/process/task_queues.js:93:5) { 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 '' at line 1", sqlState: '42000', index: 0, sql: "INSERT INTO eth_blockdata SET `number` = 9000000, `difficulty` = '2573664196528490', `extraData` = '0x7070796520e4b883e5bda9e7a59ee4bb99e9b1bc', `gasLimit` = 9994051, `gasUsed` = 9978336, `hash` = '0x388f34dd94b899f65bbd23006ee93d61434a2f2a57053c9870466d8e142960e3', `logsBloom` = '0x...', `miner` = '0x829BD824B016326A401d083B33D092293333A830', `mixHash` = '0x64e4e7f5fab8b28bb02a24dae67032197b63a7745fb82cb9fbacd5445403e7b4', `nonce` = '0xc0bb87c0203c3709', `parentHash` = '0xdbfa2da5922a4833994af5016b5ccfb2e5a4838fb44329062094912149bd5a72', `receiptsRoot` = NULL, `sha3Uncles` = '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', `size` = 41360, `stateRoot` = '0xd863e5b2ecf3dc0276aefe50762d39659811b1f10c91becee455176244085e72', `timestamp` = 1574706444, `totalDifficulty` = '13014076996386893192616', `transactions` = '0xc2d018922e1d372a8e5cc6c9e11d66ad06dc97e2618061cd33d6ef100d1eca9f,...,0x84eac3162e731088b7276cca885aa916fc5b8c11dfef13b9df2729806bbbaf57', `transactionsRoot` = NULL, `uncles` = " }

試したこと

最初は、web3.eth.getBlockで取得したオブジェクトを、そのままmysqlConnect.queryの引数に指定して書き込もうとしました。しかし、取得データではtransactionsが文字列の配列になっており、2つ目以降の要素の書き込みでエラーが出ました。そこで、joinを使用して配列transactionsを一つの文字列にまとめたところ、上記エラーが出ました。エラーメッセージも'…the right syntax to use near '' at line 1'となっておりエラー箇所がよく分かりませんでした。これ以上、何を試したらいいか分からなくなったので、質問させていただきました。
なお、質問文の文字数制限のため、エラーメッセージのsql:以降は、logsBloomとtransactionsの一部を省略しています。

補足情報

OS:MacOS 10.14.6
IDE:WebStorm 2019.3
ブラウザ:google Chrome Version 78.0.3904.108 (Official Build) (64-bit)
mysql: 2.17.1
web3.js: 2.0.0-alpha.1
node.js: 13.1.0
geth: 1.9.7-stable

以上、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

mysqlへの書き込みが上手くいきません。

テーブル構造に対して SQL文に疑問を感じ、関連ソースを見てみました。

mysql モジュールは、SQL 生成に sqlstring モジュールで簡単にSQL生成できるよう、format() メソッド が提供されています。

SQL文の生成に mysql.format() を介してみては?

javascript

1 2let sql = mysql.format('INSERT INTO ' + TABLE_NAME + ' SET ?', block2obj) 3 4await mysqlConnect.query(sql, (err, res) => { 5 if (err) throw err; 6});

投稿2019/11/28 07:55

AkitoshiManabe

総合スコア5432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pierogi.user

2019/11/29 02:41

回答ありがとうございます。 mysql.format()を使ってみましたが、同じエラーが出てしまいました。 質問後にも色々検討していたところ、取得したオブジェクトの中で文字列の配列として定義されているパラメータで空になっているものがあったので、意図的に['null']で置き換えてみたところ、上手くいきました。 回答いただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問