【问题标题】:R Multiline statement when using RSQLite使用 RSQLite 时的 R 多行语句
【发布时间】:2017-01-17 22:43:07
【问题描述】:

我有一个需要在 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;"))

【问题讨论】:

    标签: r sqlite rsqlite


    【解决方案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 语句组合成一个查询:

    【讨论】:

    • dbBegin 和 dbCommit 正是我所追求的!结合 UPDATE 可以工作,但我在两者之间有多个选择。事实上,变量表是一个用于变量的临时表。
    • 太棒了!很高兴我能帮上忙。最快被接受的答案之一。墨水还没干!
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多