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() を取得するにはどうすればよいですか?