Таблица RSQLite для конкретной сессии

Я пишу приложение с использованием блестящего, где пользователи могут добавлять, редактировать или копировать данные. Идея состоит в том, что после ввода данных во временную таблицу они загружаются в основную базу данных, и таблица сбрасывается.

Я сделал таблицу с помощью 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)

Проблема в том, что если несколько пользователей используют приложение одновременно, все данные добавляются в одну временную таблицу. Есть ли способ создать временную таблицу, специфичную для каждого сеанса?


person Nivel    schedule 04.07.2019    source источник


Ответы (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)
person Tim Biegeleisen    schedule 04.07.2019
comment
Отлично, большое спасибо! Я это попробую. Как удалить данные в таблице по окончании сеанса? - person Nivel; 04.07.2019
comment
@Nivel Тебе нужно сделать DELETE. Чтобы быть ясным, я выступаю за против использования временной таблицы, а просто использую одну таблицу, содержащую столбец, чтобы отслеживать, чей это сеанс. - person Tim Biegeleisen; 04.07.2019
comment
Хорошо, я попробую! Мне было интересно, как вызвать DELETE в конце сеанса, но я нашел ответ. Это описано здесь: stackoverflow.com/questions/49178159/ - person Nivel; 04.07.2019
comment
Рад, что вы смогли решить свою проблему :-) - person Tim Biegeleisen; 04.07.2019
comment
При использовании SQL Quary появляется следующая ошибка: Ошибка в result_create: нераспознанный токен: 6c2d0c74. Кажется, у него проблемы с распознаванием - в uuids. Вы случайно не знаете, как это решить? - person Nivel; 04.07.2019
comment
Эта ошибка выглядит так, будто вы пытаетесь создать таблицу, используя UUID в качестве имени. Это не то, о чем я говорю, и не то, что я рекомендую. - person Tim Biegeleisen; 05.07.2019
comment
@TimBiegeleisen Shiny по умолчанию предоставляет идентификатор для каждого сеанса: session$token, который можно использовать вместо uuid(). См. Пример this (щелкните закладку ...). - person ismirsehregal; 05.07.2019