2017-01-17 4 views
1

sqlite에서 실행해야하는 트랜잭션이 있습니다. 트랜잭션에는 몇 가지 쿼리가 포함됩니다. 별도로 (줄 단위로) 빌드하면 작동하지만 dbSendQuery를 n 번 호출해야합니다. 코드가 꽤 느려집니다.R RSQLite를 사용할 때 다중 행 문

이상적인 코드는 다음과 같이해야하지만, 여러 쿼리 실패

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 방법을 고려 dbBegin()dbCommit() (오류에 대한 dbRollback/W) 트랜잭션을 처리 할 수 ​​있습니다. 심지어 하나에 모든 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]") 

당신은 하나 개의 쿼리로 UPDATE 문을 결합 할 수 있습니다 :

+0

dbBegin 및 dbCommit 난 후였다 정확히입니다! UPDATE를 결합하면 작동하지만 여러 선택 항목이 있습니다. 실제로 Variable 테이블은 변수에 사용할 임시 테이블입니다. – Michael

+0

좋아요! 다행스럽게 도울 수 있어요. 가장 빠른 대답 중 하나. 잉크가 건조하지 않았습니다! – Parfait