从R插入MySQL

问题描述 投票:2回答:3

我正在使用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)
}

问题出在3td列,它是数字,但有NA值。当循环到达具有NA值的行时,它返回一个错误:

.local(conn,statement,...)出错:无法运行语句:'字段列表'中的未知列'NA'

我试图将NA更改为NaN,“NULL”和其他一些类型,但没有任何作用。如果我将NA更改为0则有效。

mysql r dbi rmysql
3个回答
1
投票

考虑运行SQL的任何应用层(如R)的编程行业参数化标准。使用这种方法,您可以避免任何字符串插值或杂乱引用封装的需要。 R的DBI标准有几种方式,其中一种是sqlInterpolate

# PREPARED STATEMENT (NO DATA) QMARKS REQUIRED BUT NAMES CAN CHANGE
sql <- "INSERT INTO trade_data (Col1, Col2, Col3, col4) 
        VALUES (?param1, ?param2, ?param3, ?param4)"

ch <- DBI::dbConnect(MySQL())
dbSendQuery(ch, 'set character set "utf8"')
dbSendQuery(ch, 'SET NAMES utf8')

for (i in 1:nrow(test)) {
  # BIND PARAMS
  query <- sqlInterpolate(conn, sql, param1 = "0", param2 = test[i, 1], 
                          param3 = test[i, 2], param4 = test[i, 3])
  # EXECUTE QUERY
  dbSendQuery(ch, query)
}

0
投票

如果您愿意将NA更改为0,那么您最好的选择是执行以下操作。

test[is.na(test)] <- 0

这将替换data.frame test中的所有NA为0.如果您愿意,也可以执行相同操作并更改为字符串'NULL'。

test[is.na(test)] <- 'NULL'

如果您只想更换一列,可以执行以下操作:

test$col3[is.na(test$col3)] <- 0


0
投票

我做对了我不得不将“”更改为“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)
© www.soinside.com 2019 - 2024. All rights reserved.