2

RSQLite光沢のあるアプリでパッケージを使用しています。ユーザーがアプリを使用するにつれて、sqlite db を動的に更新できるようにする必要があります。UPDATEこれを実現するために SQLiteの構文を使用したいのですが、同じユーザーの複数の行を更新しようとすると問題が発生しました。

次のコードを検討してください。

# Load libraries
library("RSQLite")

## Path for SQLite db
sqlitePath <- "test.db"

# Create db to store tables
con <- dbConnect(SQLite(),sqlitePath)

## Create toy data
who <- c("jane", "patrick", "samantha", "jane", "patrick", "samantha")
tmp_var_1 <- c(1,2,3, 4, 5, 6)
tmp_var_2 <- c(2,4,6,8,10,12)

# Create original table
users <- data.frame(who = as.character(who), tmp_var_1 = tmp_var_1, tmp_var_2 = tmp_var_2)
users$who <- as.character(users$who)

# Write original table
dbWriteTable(con, "users", users)

# Subset users data
jane <- users[who=="jane",]
patrick <- users[who=="patrick",]
samantha <- users[who=="samantha",]

# Edit Jane's data
jane$tmp_var_1 <- c(99,100)

# Save edits back to SQL (this is where the problem is!)
table <- "users"

db <- dbConnect(SQLite(), sqlitePath)
query <- sprintf(
  "UPDATE %s SET %s = ('%s') WHERE who = %s",
  table, 
  paste(names(jane), collapse = ", "),
  paste(jane, collapse = "', '"),
  "'jane'"
)
dbGetQuery(db, query)

## Load data to check update has worked
loadData <- function(table) {
  # Connect to the database
  db <- dbConnect(SQLite(), sqlitePath)
  # Construct the fetching query
  query <- sprintf("SELECT * FROM %s", table)
  # Submit the fetch query and disconnect
  data <- dbGetQuery(db, query)
  dbDisconnect(db)
  data
}

loadData("users")

Janeここでは、 の値が変更されるようにのエントリを更新しようとしてtmp_var_1いますが、他のすべての列は同じままです。以下に投稿された @zx8754 および @Altons からの質問への回答によると、値queryは次のとおりです。

UPDATE users SET who, tmp_var_1, tmp_var_2 = ('c(\"jane\", \"jane\")', 'c(99, 100)', 'c(2, 8)') WHERE who = 'jane'

問題はほぼ確実に、RSQlite にクエリを指定している方法に起因しています。実行するdbGetQuery(db, query)と、次のエラーが表示されます。

Error in sqliteSendQuery(con, statement, bind.data) : 
  error in statement: near ",": syntax error

改善のための提案は大歓迎です。

4

0 に答える 0