2

node-sqlite3 を使用して、node.js アプリケーションからデータベースで INSERT + UPDATE トランザクションを実行しようとしています。ただし、トランザクションが完了したときに last_insert_rowid を取得する方法がわかりません。私のクエリは次のようになります。

BEGIN TRANSACTION;
    INSERT INTO <table> (field1, ...) VALUES (value1, ...);
    UPDATE <table> SET prev=last_insert_rowid() WHERE <condition>;
END TRANSACTION;

この文字列 (余分な空白を除く) が var に割り当てられqます。

これを使用して、ある時点でデータベースを開きました:

var db = new sqlite3.Database(dbfile)

しかし、私が使用しようとすると:

db.run(q, function(err) {
    if (err) ...
    console.log(this.lastId)
})

エラーなしで「0」を出力するだけでなく、データベースへの変更も発生しません!!! exec代わりに使用するとrun、クエリは正常に実行されますが、exec からデータを取得する方法がありません。

私も次のようなことを試しました:

db.exec(q, function(err) {
    if (err) ...
    db.run(";", function(err) {
        if (err) ...
        console.log(this.lastId)
    })
})

しかし、「run」の「this」コンテキストには lastId プロパティがありません!

sqlite3-transaction パッケージも調べましたが、トランザクション コールバックでも情報が提供されていないようです。

挿入を別の run() として実行し、それを取得してthis.lastIdからそれを使用して更新を実行することはできません。これは、2 つのステートメントの間でデータベースが無効な状態のままになるためです (したがって、トランザクションが必要です)。

このトランザクションから last_insert_rowid() を取得するにはどうすればよいですか?

4

1 に答える 1