2016-09-28 20 views
1

node-sqlite3を使用して、node.jsアプリケーションからデータベースでINSERT + UPDATEトランザクションを実行しようとしています。しかし、私はトランザクションが完了したときにlast_insert_rowidを取得する方法を理解することはできません。トランザクションから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」を印刷しないだけでなく、データベースへの変更は発生しません!!! runの代わりにexecを使用すると、クエリは正常に実行されますが、execからデータを取得する方法はありません。

私も試してみました。このような何か:

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

しかし、「ファイル名を指定して実行」で「この」文脈はlastId性質を持っていません!

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

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

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

+0

MySQLで最も最近挿入されたIDを取得する機能は、いくつかの前提条件に加えて、使用されているドライバ(たとえばPerl + 'DBI' +' DBD :: mysql'モジュール)に依存する可能性があります例えば、テーブルIDが整数インクリメントに設定されている必要があります。特定のケースで同様の要件または異なる要件が適用されるかどうかを確認しましたか?どの問合せが最後に実行されたかにも依存する可能性があります。したがって、実際のトランザクションのコンテキストでもそれを実行できるかどうかを確認する必要があります。 – ray

+0

'run'を別々に呼び出しても、トランザクションを使用することができます。 'run(" BEGIN TRANSACTION "、...)'などを呼び出して、完了したら 'COMMIT TRANSACTION'を呼び出すか、エラーがあれば' ROLLBACK TRANSACTION'を呼び出してください。 – cartant

+0

@カルタントありがとう、私は確かに発見し、私は昨日出発する前に正常にそれを試してみましたが、時間がまだそれを文書化していない。 – Michael

答えて

0

last_insert_rowid()を取得するには、トランザクションを次のように分割する必要があります。まず、トランザクションを開始するクエリを実行します。

db.run("BEGIN TRANSACTION") 

次に、コールバックでROWIDを取得し、行を挿入するためのコマンドを実行します。

// replace stuff in angle brackets and ellipses with proper values 
db.run("INSERT INTO <table> (field1, ...) VALUES (value1, ...);", function(err,data) { 
    if (err) ... 
    rowid=this.lastID // rowid declared in scope visible outside callback 
}) 

次に、更新を実行します。トランザクションはまだコミットされていないので、これらのコールバックはまだ呼び出されません。更新はトランザクションの最後のステートメントであるので、それは、トランザクション全体が成功するはず成功した場合、この場合、

db.run("END TRANSACTION;") 

、それを行うのは安全でなければならない:

db.run("UPDATE <table> SET prev=last_insert_rowid() WHERE <condition>;", function(err,data) { 
    // do whatever needs doing after update is done here 
}) 

今トランザクションをコミットその場所での取引の後に何をする必要があるのか​​。

関連する問題