2017-11-29 10 views
0

データベースで動的な挿入ステートメントを使用しようとしていますが、文字列では失敗します。以下のコードを参照してください。dbSendQueryテキスト付きのINSERTステートメント

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

df1 <- data.frame(stringsAsFactors = F, id = 1:4, value = letters[1:4]) 
df2 <- data.frame(stringsAsFactors = F, id = 1:4, value = 100:103) 

con <- dbPool(SQLite(), dbname = "test") %>% poolCheckout() 
dbWriteTable(con, "with_text", df1, overwrite = T) 
dbWriteTable(con, "no_text", df2, overwrite = T) 

db1 <- dbReadTable(con, "with_text") 
db2 <- dbReadTable(con, "no_text") 

new1 <- db1[1,] 
new2 <- db2[1,] 

query1 <- sprintf(
    "INSERT INTO %s (%s) VALUES (%s);", 
    "with_text", 
    paste(names(new1), collapse = ", "), 
    paste(new1, collapse = ", ") 
) 
query2 <- sprintf(
    "INSERT INTO %s (%s) VALUES (%s);", 
    "no_text", 
    paste(names(new2), collapse = ", "), 
    paste(new2, collapse = ", ") 
) 

db_query1 <- dbSendStatement(con, query1)#fails 
dbClearResult(db_query1) 
dbReadTable(con, "with_text") 

db_query2 <- dbSendStatement(con, query2) 
dbClearResult(db_query2) 
dbReadTable(con, "no_text") 

#failsラインは、このエラーを生成します。Query1をの

Error in rsqlite_send_query([email protected], statement) : no such column: a 

値は次のとおりです。

[1] "INSERT INTO with_text (id, value) VALUES (1, a);" 

私は問題が周りの単一引用符( ')の欠如であると認識テキスト値ですが、回避策が必要です。どんな助けもありがとうございます。私は列の型を追加しようとしましたが、動作させることができませんでした。

+0

'query1'の値を –

+0

@ W.Murphyに追加できますか?それは、テキストフィールドを使用する点を除いてquery2と同じです。私は問題がテキスト値の回りに一重引用符( ')がないことを認識していますが、そのための回避策が必要です。 > query1 [1] "INSERT INTO with_text(id、value)VALUES(1、a);" – Spencer

答えて

1

私はこれが単純な例であることを知っていますので、このソリューションは実際の使用例でうまくいくことを願っています。

`query1 = sprintf("INSERT INTO %s (%s) VALUES (%s,\'%s\');", 
       "with_text", paste(names(new1), collapse = 
       ","),new1[1,1],new1[1,2])` 

さらに詳しい説明を追加しています。 2番目の値がテキストになることが分かっている場合は、sprintfにその値を囲むように単一引用符を追加できますが、行全体を呼び出して一緒に貼り付けるのではなく、これらの値を個別に呼び出す必要があります。私は\'%s\'を二重引用符で囲んでエスケープした後、別々に値を呼び出しました。

関連する問題