带有文本的 dbSendQuery INSERT 语句
dbSendQuery INSERT statement with text
我正在尝试对我的数据库使用动态插入语句,但它在字符列上失败了。请参阅下面的代码。
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 行产生此错误:
Error in rsqlite_send_query(conn@ptr, statement) : no such column: a
query1 的值为:
[1] "INSERT INTO with_text (id, value) VALUES (1, a);"
我意识到问题是文本值周围缺少单引号 ('),但必须有解决方法。任何帮助表示赞赏。我尝试添加列类型,但无法正常工作。
我知道这是一个简化的示例,所以我希望此解决方案适用于您的实际用例。
`query1 = sprintf("INSERT INTO %s (%s) VALUES (%s,\'%s\');",
"with_text", paste(names(new1), collapse =
","),new1[1,1],new1[1,2])`
我正在编辑以添加更多解释。如果您知道您的第二个值将是文本,那么您可以在 sprintf 中添加单引号以包围该值,但您需要分别调用这些值,而不是调用整行并将它们粘贴在一起。我在您的第二个值周围添加了 \'%s\'
转义单引号,然后分别调用这些值。
我正在尝试对我的数据库使用动态插入语句,但它在字符列上失败了。请参阅下面的代码。
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 行产生此错误:
Error in rsqlite_send_query(conn@ptr, statement) : no such column: a
query1 的值为:
[1] "INSERT INTO with_text (id, value) VALUES (1, a);"
我意识到问题是文本值周围缺少单引号 ('),但必须有解决方法。任何帮助表示赞赏。我尝试添加列类型,但无法正常工作。
我知道这是一个简化的示例,所以我希望此解决方案适用于您的实际用例。
`query1 = sprintf("INSERT INTO %s (%s) VALUES (%s,\'%s\');",
"with_text", paste(names(new1), collapse =
","),new1[1,1],new1[1,2])`
我正在编辑以添加更多解释。如果您知道您的第二个值将是文本,那么您可以在 sprintf 中添加单引号以包围该值,但您需要分别调用这些值,而不是调用整行并将它们粘贴在一起。我在您的第二个值周围添加了 \'%s\'
转义单引号,然后分别调用这些值。