从R插入MySQL

从R插入MySQL,mysql,r,dbi,rmysql,Mysql,R,Dbi,Rmysql,我正在使用DBI包将数据插入MySQL。代码如下: ch <- DBI::dbConnect(MySQL()) dbSendQuery(ch, 'set character set "utf8"') dbSendQuery(ch, 'SET NAMES utf8') for (i in 1:nrow(test)) { query <- paste0("INSERT INTO trade_data VALUES('0', '", test[i, 1], "', '",

我正在使用DBI包将数据插入MySQL。代码如下:

ch <- DBI::dbConnect(MySQL())
dbSendQuery(ch, 'set character set "utf8"')
dbSendQuery(ch, 'SET NAMES utf8')
for (i in 1:nrow(test)) {
  query <- paste0("INSERT INTO trade_data VALUES('0', '", test[i, 1], "', '",
                  test[i, 2], "', ", test[i, 3], "')")
  dbSendQuery(ch, query)
}

ch如果您愿意将NA更改为0,那么您最好执行以下操作


test[is.na(test)]考虑任何应用程序层(如运行SQL的R)的参数化编程行业标准。使用这种方法,您可以避免任何字符串插值或混乱的引号附件的需要。R的DBI标准有几种方法,其中之一是:

#准备好的语句(无数据)需要标记,但名称可以更改

sql我做对了。我必须将“”更改为“NULL”,将NA更改为NULL,然后在insert中使用ifelse语句。像这样:

ch <- DBI::dbConnect(MySQL())
dbSendQuery(ch, 'set character set "utf8"')
dbSendQuery(ch, 'SET NAMES utf8')
test[test == ""] <- "NULL"
test[is.na(test)] <- "NULL"
for (i in 1:nrow(test)) {
  query <- paste0("INSERT INTO trade_data VALUES('0', '", test[i, 1], "', ",
                  ifelse(test[i, 2] == "NULL", test[i, 2], paste0("'", test[i, 2], "'")), ", ", 
                  ifelse(test[i, 3] == "NULL", test[i, 3], paste0("'", test[i, 3], "'")), ", ",
                  # test[i, 3],", ", 
                  test[i, 4], ", ",
                  test[i, 5], ", ",
                  test[i, 6], ", ", test[i, 7] , ", ",
                  test[i, 8], ", ", test[i, 9] , ", ",
                  test[i, 10], ", ", test[i, 11] , ", '",
                  test[i, 12], "')")
  dbSendQuery(ch, query)
}
DBI::dbDisconnect(ch)

ch检查第三列是否等于NA,如果等于,则转换为0。顺便说一句,在结束之前似乎有一个额外的单引号)我不想将NA设置为零,因为我不知道哪个是0,哪个是NA。对于
NA
s,将字符串“NULL”更改为
NULL
他们希望子字符串
NULL
位于
值之间的查询字符串中。不是
'NULL'
。我尝试了您的代码,但它返回了一个错误:`error in.local(conn,statement,…):无法运行语句:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在“101.2、101.2、`0.05、101.2、101.2、101.2、101.2、250000、253000、02.01.2008)”第1行“在我将“”更改为NA之后,它在字符内的点上有问题:在.local(conn、statement,…)中出错:无法运行语句:SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以了解在第2行“.2008)”附近使用的正确语法。如果省略显式列,则此
INSERT
假设交易数据中有超过4列。确保包含所有要更新数据的列:
插入交易数据(Col1、Col2、Col3,…)值(…
您的问题没有提到希望空字符串变为null。在SQL中,空字符串不为null。(只有Oracle将空字符串等同于null,这不是标准SQL。)
ch <- DBI::dbConnect(MySQL())
dbSendQuery(ch, 'set character set "utf8"')
dbSendQuery(ch, 'SET NAMES utf8')
test[test == ""] <- "NULL"
test[is.na(test)] <- "NULL"
for (i in 1:nrow(test)) {
  query <- paste0("INSERT INTO trade_data VALUES('0', '", test[i, 1], "', ",
                  ifelse(test[i, 2] == "NULL", test[i, 2], paste0("'", test[i, 2], "'")), ", ", 
                  ifelse(test[i, 3] == "NULL", test[i, 3], paste0("'", test[i, 3], "'")), ", ",
                  # test[i, 3],", ", 
                  test[i, 4], ", ",
                  test[i, 5], ", ",
                  test[i, 6], ", ", test[i, 7] , ", ",
                  test[i, 8], ", ", test[i, 9] , ", ",
                  test[i, 10], ", ", test[i, 11] , ", '",
                  test[i, 12], "')")
  dbSendQuery(ch, query)
}
DBI::dbDisconnect(ch)