2012-04-05 21 views
4

nodejsnode-sqlite3パッケージを使用してsqlite dbの行の削除を実行しようとしています。Nodejs node-sqlite3コールバックが動作しない

私はdeleteコマンドを実行し、手動でエントリをチェックすると、その行がその行を正常に削除したことがわかりますが、これを確認するコードが書かれているようです。

これは、クエリ

db.run("DELETE FROM Table1 WHERE id=? AND username=?", [id, user], function(error) { 
console.log(error); 
}); 

は関係なく、間違っているか、右入力の、それはコンソールにnullを出力します。正しい詳細が与えられていれば、それを削除してヌルを出力します。idとuserが間違っていれば、それでもnullを出力します。

何が間違っている可能性がありますか?

ありがとうございます。

+1

私は何かが間違っているとは思いません。バインドされたパラメータがnullまたは未定義の場合には当てはまらないクエリが失敗したとき(mysqlは拒否)にエラーが発生します。実際の危険は、間違ったものを削除しようとしていることです。 –

答えて

4

ノードとノードsqlite3の動作に問題はありません。 ここでは、Sqliteに関してノードとその他について最初に説明する2つの部分があります。

Node

あなたのコールバックは、ステートメントの実行後に呼び出さなっています。あなたのコールバックが呼び出されているので、ここでは何も間違っていません(出力として 'null'によって証明されているように)。 where句で指定した条件が真と評価された場合に

Sqliteを中Sqlite

削除クエリは、そうでない場合は何も削除されていない、削除されます。

node-sqlite3 documentation's Database#run apiから参照:

コールバック(オプション):指定した場合、それはエラーが文の準備や実行のいずれかのステップの間に を発生したときに呼び出されます、そして 後にクエリを実行しました。エラーが発生した場合、最初の(そして唯一の) パラメータはエラーメッセージを含むエラーオブジェクトになります。 実行が成功した場合、最初のパラメータはnullです。

だから、あなたの場合には、クエリの実行を使用すると、出力に見るように機能nullをcallbackにerror引数で、その結果、エラーなしで成功します。さらに

、あなたが任意の行が実際に削除されたかどうかを確認したい場合は文書で述べたように、あなたがchangesプロパティを使用することができます。

実行が成功した場合、それは「lastID」 という名前の2つのプロパティが含まれており、最後に挿入された行IDの値を含む「変更」と、このクエリによって影響を受ける行の数はそれぞれ です。 "lastID"は、クエリが INSERT文を正常に完了し、クエリが正常に完了したUPDATE またはDELETE文の場合にのみ、有効な情報が含まれていることに注意してください。それ以外の場合は、これらのコンテンツの内容が不正確であり、使用しないでください。 .run()関数 は、これらの2つの値を設定する唯一のクエリメソッドです。他のすべてのクエリ .all()や.get()などのメソッドは、これらの値を取得しません。

は、私は、コールバックだけで起動しませう、同様の問題があった

+0

ありがとうございます。私の日を救った – Kingalione

1

...それがお役に立てば幸いです。期間。問題は、私がprocess.exit(1)を呼び出そうとしていたので、コールバックが復帰する前にコードが終了していたことです。

(あるいはない場合があります)process.exitを検索するには、あなたにデバッグの時間を節約し、オフトピックのsqlite :)

を非難:どのようなバグが私の心はlastIDでなぜ彼らはすべてのキャップのIDです。これは、SQLやUSAのような省略形とは異なります。それはIdentificationの略で、これは1語です。

1

私はnodejs 4.3とsqlite3にいくつか問題があります:3.1.1。

問題は、更新が1つの行に影響を及ぼさないときから、更新が1つの行に影響を及ぼさないとき(最初は選択せずに)に分離したいということです。

私の例では、id = 1の行があります。id = 1111の更新を行うと、影響を受けていないことを知りたいと思います。

私はdatabase.runでコールバックを使用しましたが、データベース内の行に対して更新が実行されると、this.changesの値を評価していないようです。 (私はしないDBに、例えば1111111のために、IDを使用する場合と同じ)

var sql = 'update recipes set stars = stars + 1 where id = ?'; 

db.run(sql, 
    [ 
    1 // id = 1 execute update - if id = 11111 do nothing 
    ], (err) => { 
     if(err) 
      throw err; 

     console.log("VALUE CHANGES: " + this.changes + " - " + util.inspect(this, { showHidden: false, depth: null })); 

     if(this.changes == 1) 
      console.log("WORK DONE"); 
     else 
      console.log("NOTHING DONE"); 

    }); 

this.changesは、更新が正常に実行された場合であっても不定です。

バグがありますか、コールバックの使い方を理解していませんか?コンソール上の

結果は: 値の変化:不定 - {DB:データベース{オープン:真、ファイル名: './dindin.sqlite'、モード:65542}}

同じID = 1の場合1行(id = 1111111)でupdateを実行し、none行でupdateを実行します。

1

私のprevoiusの質問には、私は太い矢印をコールバック宣言に使用したという問題がありました。 javascriptのドキュメントから、の矢印機能(太い矢印)、にはの字句範囲があることがわかりました。この結果はライブラリのマニュアルのように未定義であり、価値がありません。そうでなければ異種の関数を使用すると、これはの動的範囲に束縛されます。したがって、this.changesが評価されます。

さて、以下のようなコードで、okです:ここで

var sql = 'update recipes set stars = stars + 1 where id = ?'; 

db.run(sql, 
    [ 
    1 // id = 1 execute update - if id = 11111 do nothing 
    ], function(err) { 
     if(err) 
      throw err; 

     console.log("VALUE CHANGES: " + this.changes + " - " + util.inspect(this, { showHidden: false, depth: null })); 

     if(this.changes == 1) 
      console.log("WORK DONE"); 
     else 
      console.log("NOTHING DONE"); 

    }); 

もっと説明:https://github.com/mapbox/node-sqlite3/issues/606

関連する問題