4

nodejsnode-sqlite3パッケージを使用してsqliteデータベースの行の削除を実行しようとしています。

削除コマンドを実行してエントリを手動で確認すると、クエリによってその行が正常に削除されたことがわかりますが、これを確認するコードを記述できないようです。

これはクエリです

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

入力が間違っていても正しくてもnull、コンソールに出力されます。正しい詳細が指定されている場合は、それを削除してnullを出力します。間違ったIDとユーザーが指定されている場合でも、nullを出力します。

何が間違っているのかについてのアイデアはありますか?

ありがとう

4

3 に答える 3

4

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

Node

ステートメントの実行後にコールバックが呼び出されます。コールバックが呼び出されているので、ここでは何も問題はありません(出力として「null」で証明されています)。

Sqlite

SqliteのDeleteクエリは、where句で指定された条件がtrueと評価された場合に削除され、それ以外の場合は何も削除されません。

node-sqlite3ドキュメントのDatabase#run apiから参照:

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

したがって、この場合、クエリの実行はエラーなしで成功し、出力に表示されるerrorようにコールバック関数への引数が生成さnullれます。

さらに、行が実際に削除されたかどうかを確認する場合changesは、ドキュメントに記載されているプロパティを使用できます。

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

それが役に立てば幸い...

于 2013-01-24T14:20:40.573 に答える
4

私の前の質問に対して、問題は、コールバック宣言に太い矢印を使用したことでした。javascriptのドキュメントから、矢印関数(太い矢印)では、これ字句スコープを持っているため、ライブラリのドキュメントにあるように、この結果は未定義であり、評価されないことがわかりました。それ以外の場合は匿名関数を使用すると、これは動的スコープに制限されるため、 this.changesが評価されます。

さて、以下のようなコードで、大丈夫です:

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

于 2016-03-03T15:28:09.393 に答える
3

私も同様の問題を抱えていました。コールバックは起動しませんでした。限目。問題は、他の場所でprocess.exit(1)を呼び出していたため、コールバックが戻る前にコードが終了していたことです。

process.exitを検索してください。これにより、sqliteのデバッグと非難にかかる時間を節約できる(または節約できない)可能性があります:)

トピックから外れています:私の心のバグは、なぜそれらがlastIDのIDをすべて大文字にするのかということです。SQLやUSAのような略語ではありません。これはIdentificationの略で、1つの単語です。

于 2013-06-19T20:39:50.073 に答える