Многострочный оператор R при использовании RSQLite

У меня есть транзакция, которую нужно запустить на sqlite. Транзакция включает несколько запросов. Если он построен отдельно (построчно), он работает, но требует вызова dbSendQuery n раз. Это немного замедляет код.

Идеальный код должен выглядеть так, но многострочный запрос не работает:

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;"))

person Michael    schedule 17.01.2017    source источник


Ответы (1)


Рассмотрим методы RSQLite: dbBegin() и dbCommit()dbRollback для любых ошибок) для обработки транзакций. Даже рассмотрите возможность объединения всех 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 в один запрос:

person Parfait    schedule 17.01.2017
comment
dbBegin и dbCommit — это именно то, что мне нужно! Объединение UPDATE будет работать, но у меня есть несколько промежуточных вариантов. На самом деле таблица переменных — это временная таблица для переменных. - person Michael; 18.01.2017
comment
Большой! Рад, что смог помочь. Один из самых быстрых принятых ответов. Чернила даже не высохли! - person Parfait; 18.01.2017