首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RSQLite时的r多行语句

使用RSQLite时的r多行语句
EN

Stack Overflow用户
提问于 2017-01-17 22:43:07
回答 1查看 399关注 0票数 1

我有一个交易,需要运行的sqlite。事务包括几个查询。如果单独构建(逐行),它可以工作,但它需要调用dbSendQuery n次。它使代码的速度减慢了很多。

理想的代码应该如下所示,但是多行查询失败:

代码语言:javascript
复制
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;"))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-17 23:23:10

考虑RSQLite方法:dbBegin()dbCommit() (对于任何错误,w/ dbRollback )来处理事务。甚至考虑将所有UPDATE语句合并为一个:

代码语言:javascript
复制
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语句组合成一个查询:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41708350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档