2016-12-03 34 views
2

私はNode.jsとmysql NPM packageを使ってMySQL 5.7.14インスタンスと対話しています。私は私が作ってるんだクエリで構文エラーに関するエラーを取得しています:私はこれは私が作っ間違いでなければならないと思ったNPM 'mysql'モジュールを使用したMySQL構文エラー

まず

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 'INSERT INTO votes (user_uid, node_uid, sentiment) VALUES ('fakeid-123'' at line 1

私がやっている私の入力値を、MySQLのエスケープNode.jsの中で次のよう

query = 
    'START TRANSACTION; ' + 
    'INSERT INTO votes (user_uid, node_uid, sentiment) VALUES (' + 
    connection.escape(user_uid) + ', ' + 
    connection.escape(node_uid) + ', ' + 
    connection.escape(newValue) + 
    '); ' + 
    'UPDATE nodes SET votification=votification+' + newValue + ' ' + 
    'WHERE uid=' + connection.escape(node_uid) + ';' + 
    'COMMIT;' 
connection.query(query, function(err, rows) { //.. blah blah 

はしかし、私はそれがconnection.queryに渡される直前query変数の値をチェックするためにコンソールログを追加した、と私は、クエリの完全に合法的に見えるセットを取得しています:

START TRANSACTION; INSERT INTO votes (user_uid, node_uid, sentiment) VALUES ('fakeid-123', 'start', 1); UPDATE nodes SET votification=votification+1 WHERE uid='start';COMMIT;

ただし、上記のエラーが発生しています。私は、このクエリ文字列をそのままMySQLコンソールセッションにコピー&ペーストしようとしました。

これはNPM/mysqlモジュールでエラーですか?何らかの形でこの方法でトランザクションをサポートしていませんか?他に何が間違っているのでしょうか? MySQLに直接コピー&ペーストすると動作するので、クエリとトランザクションの作成は大丈夫だと思います。

私はこのモジュールを広範囲に使用していますが、これは偶然にもこのような失敗が発生する唯一のクエリであり、私はトランザクションを使用している唯一の場所です。私はこれらの2つのコールを「個別に」したくないので、ここでトランザクションを使用しています。 connectionオブジェクトは固いものだと私は知っています。なぜなら、このスコープ内の他の場所で問題なく使用しているからです。

メモ/編集:documentation for the mysql NPM module on transactionsが表示されます(これは現在では代わりに実装しています)。これは、私が望むものを実装するための非常に頑丈な方法です。なぜ、私が渡しているものを渡すのがわかりますか失敗する。私がチェックし、この中に思い付いた遊ん

+0

これを3つのクエリに分割しようとしましたか? –

+0

私はトランザクションによって提供されるアトミック性を維持したいと考えていました。私は特に、競合状態や他のユーザーからの干渉が潜在的にDB内の同じ行にアクセスするのを防ぐために、3つの個別のクエリを作成することを避けようとしています。 – Steverino

+0

。私は周りに1分ほど麺を敷き詰め、答えを出しました。 –

答えて

2

は、ドキュメントを与えた:

var connection = mysql.createConnection({multipleStatements: true}) 

複数のクエリをデフォルトで無効になっています。

+0

私は接続ではなく、接続プールを使用していますが、答えに基づいて試してみます: 'var pool = mysql.createPool({multipleStatements:true、/ * others * /});'私がクエリを作成している範囲外のものからすべての価値を逃しているので、このテクニックを避けるために言及したセキュリティの理由を心配していません。 (PS:それは働いた、ありがとう!!) – Steverino