2017-01-17 4 views
1

sqlite上で実行する必要があるトランザクションがあります。トランザクションにはいくつかのクエリが含まれています。別々に(行ごとに)構築すると動作しますが、dbSendQueryをn回呼び出す必要があります。それはコードをかなり遅くします。R RSQLiteを使用する場合の複数行文

理想的なコードは次のようになりますが、複数行のクエリは失敗します。トランザクションを処理するためにdbBegin()dbCommit()(すべてのエラーのためdbRollback /ワット):

library("RSQLite") 
con <- dbConnect(RSQLite::SQLite(), dbname="test.db") 
dbSendQuery(con, paste("CREATE TABLE Variables (Name TEXT PRIMARY KEY, RealValue REAL, IntegerValue INTEGER, BlobValue BLOB, TextValue TEXT)")) 
dbSendQuery(con, paste("INSERT INTO Variables (Name) VALUES ('newid');")) 
dbSendQuery(con, paste("BEGIN IMMEDIATE TRANSACTION;", 
         "UPDATE Variables SET TextValue = '0' WHERE Name = 'newid';", 
         "UPDATE Variables SET RealValue = 0 WHERE Name = 'newid';", 
         "UPDATE Variables SET IntegerValue = 0 WHERE Name = 'newid';", 
         "COMMIT;",sep=" ")) 
a <- dbFetch(dbSendQuery(con, paste("SELECT * FROM _Variables;"))) 
dbSendQuery(con, paste("COMMIT;")) 

答えて

3

RSQLite方法を考えてみましょう。でも一つにすべてUPDATE文を組み合わせることを検討:

library("RSQLite") 
con <- dbConnect(RSQLite::SQLite(), dbname="test.db") 
dbSendStatement(con, "CREATE TABLE [Variables] ([Name] TEXT PRIMARY KEY, [RealValue] REAL, [IntegerValue] INTEGER, [BlobValue] BLOB, [TextValue] TEXT)") 
dbSendStatement(con, "INSERT INTO [Variables] ([Name]) VALUES ('newid')") 

dbBegin(con) 
tryCatch({ 
    dbSendStatement(con, "UPDATE [Variables] SET TextValue = '0', RealValue = 0, IntegerValue = 0 WHERE [Name] = 'newid'") 
}, error=function(e) dbRollback(con)) 
dbCommit(con) 

a <- dbGetQuery(con, "SELECT * FROM [Variables]") 

あなたも、1つのクエリにUPDATE文を組み合わせることができます。

+0

dbBeginとdbCommitは私が後だったまさにです! UPDATEを組み合わせることはできますが、複数の選択肢があります。実際、Variableテーブルは変数に使用する一時テーブルです。 – Michael

+0

素晴らしい!お役に立てて嬉しいです。最も速く受け入れられる答えの1つ。インクは乾いていませんでした! – Parfait

関連する問題