2017-11-29 5 views
0

데이터베이스에서 동적 삽입 문을 사용하려고하지만 문자 열에 오류가 발생합니다. 아래 코드를 참조하십시오.dbSendQuery 텍스트가있는 INSERT 문

Error in rsqlite_send_query([email protected], statement) : no such column: a 
는 쿼리 1의 값은

:

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

나는 문제는 주위에 작은 따옴표 (')의 부족을 실감

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 라인이 오류가 발생합니다 텍스트 값이지만 해결 방법이 있어야합니다. 어떤 도움을 주셔서 감사합니다. 열 유형을 추가하려고 시도했지만 작동하지 못했습니다.

+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])` 

더 많은 설명을 추가하고 있습니다. 두 번째 값이 텍스트가 될 것이라는 것을 알고 있다면 sprintf에 작은 따옴표를 추가하여 해당 값을 감쌀 수 있지만 전체 행을 호출하고 함께 붙여 넣는 대신이 값을 별도로 호출해야합니다. 나는 두 번째 값 주위에 \'%s\' 이스케이프 된 작은 따옴표를 추가 한 다음 값을 따로 따로 호출했습니다.