0

R 的绝对初学者,所以请原谅任何明显的问题。

我正在尝试使用来自 Deducer 的数据框更新 MySQL 表(数据库'test'中的'exdata3')。

我最初调用了数据库并在推断器中使用了该表,对其运行一些查询,这些查询存储在数据帧“data1”中。现在我想发送包含一个新列的“data1”并更新 MySQL 中的非空表 exdata3。

(将来我可能没有新的列/行,但与 MySQL 中的相同列相比,现有列在数据框中可能具有不同的值,如果您知道我的意思的话)

MySQL 中数据框和表之间的区别在于在数据框中添加了“DiffHighLow”列(其中包含从表中的其他两个列计算的值)。

我在 64 位 Windows7 上使用 RODBC 在 R 和 MySQL 之间进行通信

我已经尝试了以下错误。

1. > sqlSave(channel, data1, exdata3, append= TRUE,rownames = "DiffHighLow", colnames = TRUE, verbose = FALSE, 更安全 = TRUE, addPK = FALSE, "integer", fast = TRUE, test = FALSE, nastring =空)

sqlSave 中的错误(通道,data1,exdata3,append = TRUE,rownames = “DiffHighLow”,:找不到对象“exdata3”

2.> sqlSave(通道, data1, rownames = "DiffHighLow", addPK = TRUE)

sqlSave(通道,data1,rownames =“DiffHighLow”,addPK = TRUE)中的错误:42S21 1060 [MySQL][ODBC 5.3(w)驱动程序][mysqld-5.0.41-community-nt]重复的列名'diffhighlow'

[RODBC] 错误:无法 SQLExecDirect 'CREATE TABLE data1DiffHighLowvarchar(255) NOT NULL PRIMARY KEY,exdata3_idinteger,datedouble,opendouble,highdouble,lowdouble,closedouble,shares_integer,turnover_double,diffhighlowdouble)'

第三。> sqlUpdate(通道,data1,“exdata3”)

sqlUpdate(channel, data1, "exdata3") 中的错误:数据框列日期开盘高低收盘股_营业额_diffhighlow 不在数据库表中

除其他外,我不明白为什么它不能识别数据库表中已经存在的行名,除了“DiffHighLow”

请指教。我已经在 SO 上搜索了很多这样的问题,并尝试了已经发布的各种解决方案(与我的查询最相似),但它们似乎都不起作用。

4

1 回答 1

1

如果我理解正确,您将表的内容exdata3从 MySQL 数据库加载到 R 中,通过添加一个新列来修改它,DiffHighLow现在您想将其保存回 MySQL 数据库。如果这就是你想要做的,这将起作用:

# this just sets up the example
set.seed(1)    # for reproducible example
df <- data.frame(Open=rnorm(50), Low=rnorm(50), High=rnorm(50), Close=rnorm(50))
library(RODBC)
channel <- odbcConnect(dsn="MySQL", case="nochange")
sqlSave(channel,df,"exdata3", rownames=F)

data1 <- sqlQuery(channel,"select * from exdata3")
data1 <- transform(data1,DiffHighLow=High-Low)

# you start here
sqlQuery(channel,"drop table exdata3")
sqlSave(channel,data1,"exdata3")
result <- sqlQuery(channel,"select * from exdata3")
head(result)

基本问题是,要么sqlSave(...)根本不存在 MySQL 表(在这种情况下将创建它),要么它具有与数据库中的列完全映射的列。您不能使用. 所以这段代码只是删除了原始版本,然后从. 最后一行只是读回表格以证明它有效。sqlSave(...)exdata3data1

您的代码有几个问题。

第一次尝试失败,因为您传递的是变量名exdata3,而不是字符串"exdata3"。您的 R 环境中没有命名变量exdata3,因此出现错误:“找不到对象'exdata3'”。

第二次尝试失败,因为您告诉 ODBC 驱动程序将数据框的行名保存在名为 的列diffhighlow中,但已经有一个data1具有该名称的列,因此驱动程序正在尝试创建两个具有相同名称的列。

第三次尝试失败,因为 中的列exdata3未映射到 中的列data1

于 2014-09-05T04:57:34.093 回答