SQL查询包含'('从rmysql生成时)

时间:2016-09-15 13:32:07

标签: r rmysql

我使用库RMySQL生成SQL语句

query <- sprintf("foo", paste(mydf, collapse = "', '",sep = ','))

当我查看查询时,它似乎将所有内容放在括号中,例如,一列将包含单一术语10.50, 20.50, 50.33但是当我查看SQL时,它将其作为c(10.50,20.50, 50.33)导致我的SQL崩溃。有谁知道为什么?

可重复的例子

mydf <- data.frame(
   X = sample(1:10),
   Y = sample(c("yes", "no"), 10, replace = TRUE)
 )

 # Construct the update query by looping over the data fields
 query <- sprintf("INSERT INTO feedback (X,Y) VALUES ('%s')",
                  paste(mydf, collapse = "', '",sep = ','))


> cat(query)
INSERT INTO feedback (X,Y) VALUES ('c(8, 6, 10, 9, 3, 4, 5, 7, 2, 1)', 'c(1, 2, 1, 2, 2, 1, 1, 1, 2, 2)')

谢谢

1 个答案:

答案 0 :(得分:1)

如上所述,请考虑使用dbWriteTable()将数据帧导入现有的MySQL数据库表。 Dataframe列应与数据库表的列名和类型(或可强制类型)或使用field.types参数中的命名列表指定的类型匹配:

dbWriteTable(conn, "MyTable", mydf, row.names = FALSE, append = TRUE) 

此外,数据框不需要详尽无遗地填充数据库表中的每个当前列,因此请忽略任何自动字段,如自动增量ID和时间戳。

考虑使用定期清理的临时临时表,可能需要避免重复(w / NOT IN or NOT EXISTS or LEFT JOIN / IS NULL查询)和/或匹配df中不在db表中的不同命名或附加列:

dbSendQuery(conn, "DELETE FROM MyTempTable")  # OR USE overwrite = TRUE in next line
dbWriteTable(conn, "MyTempTable", mydf, row.names = FALSE, append = TRUE) 
dbSendQuery(conn, "INSERT INTO MyTable (Col1, Col2, Col3, ...)
                   SELECT Col1, Col2, Col3 ... FROM MyTempTable")