【问题标题】:Session specific RSQLite table会话特定的 RSQLite 表
【发布时间】:2019-07-04 10:20:59
【问题描述】:

我正在使用 Shiny 编写一个应用程序,用户可以在其中添加、编辑或复制数据。这个想法是,在他们在临时表中输入数据后,将其上传到主数据库并重置表。

我使用 RSQLite 制作了一个表格,代码如下:

    library(RSQLite)
    library(pool)
    library(DBI)

    pool <- dbPool(RSQLite::SQLite(), dbname = "db.sqlite")

    df <- data.frame( name=character(),
                      group=character(),
                      stringsAsFactors = FALSE)

    dbWriteTable(pool, "#df_temp", df, temporary = TRUE, overwrite = TRUE)

问题在于,如果多个用户同时使用该应用程序,所有数据都会添加到同一个临时表中。有没有办法为每个会话创建一个特定的临时表?

【问题讨论】:

    标签: shiny rsqlite


    【解决方案1】:

    您的表设计应更改为包含一个跟踪数据所属特定会话的列。这是一种选择:

    library(uuid)
    
    df <- data.frame(sessionId=character(),
                     name=character(),
                     group=character(),
                     stringsAsFactors=FALSE)
    
    # populate the data frame
    
    # assign a UUID (unique identifier) for this particular R user session
    sessionId = uuid()
    df$sessionId = sessionId
    dbWriteTable(pool, "user_data", df, overwrite=FALSE, append=TRUE)
    

    在会话结束时,您可以删除所有已创建的记录:

    conn <- dbConnect(RSQLite::SQLite(), "your.db")
    sql <- paste0("DELETE FROM user_data WHERE uuid = ", sessionId)
    dbExecute(conn, sql)
    

    【讨论】:

    • 非常感谢!我会试试看。会话结束时如何删除表中的数据?
    • @Nivel 你需要做一个DELETE。为了清楚起见,我提倡反对使用临时表,而只是使用包含一列的单个表来跟踪它是谁的会话。
    • 好的,我会试试的!我想知道如何在会话结束时触发 DELETE,但我找到了答案。此处描述:stackoverflow.com/questions/49178159/…
    • 很高兴您能够解决您的问题 :-)
    • 我在使用 SQL quary 时收到以下错误:result_create 中的错误:无法识别的令牌:“6c2d0c74”。它似乎无法识别 uuid 中的“-”。你会碰巧知道如何解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2013-05-25
    • 1970-01-01
    • 2011-10-05
    • 2015-05-12
    相关资源
    最近更新 更多