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、“整数”、fast=TRUE、test=FALSE、nastring=NULL )
sqlSave 中出现错误( channel ,data1,exdata3,append = TRUE,rownames =“DiffHighLow”,: 找不到对象“exdata3”
2.> sqlSave( channel , data1, rownames = "DiffHighLow", addPK = TRUE)
sqlSave(channel, data1, rownames = "DiffHighLow", addPK = TRUE) 中出现错误: 42S21 1060 [MySQL][ODBC 5.3(w) 驱动程序][mysqld-5.0.41-community-nt]重复列名“diffhighlow”
[RODBC] 错误:无法 SQLExecDirect 'CREATE TABLE data1
(DiffHighLow
varchar(255) NOT NULL PRIMARY KEY,exdata3_id
整数, 日期
double ,打开
double ,高
double ,低
double ,关闭
double , shares_
整数,turnover_
double ,diffhighlow
double )'
第三。 > sqlUpdate( channel ,data1,“exdata3”)
sqlUpdate( channel 、data1、“exdata3”) 中出现错误: 数据框列 日期 开盘价 最高价 最低价 收盘价 股票_成交量_ diffhighlow 不在数据库表中
除其他事项外,我不明白为什么它无法识别数据库表中已存在的行名称(“DiffHighLow”除外)
请指教。我已经在 SO 上搜索了很多这样的问题,并尝试了已经发布的各种解决方案(看起来与我的查询最相似),但它们似乎都不起作用。
最佳答案
如果我理解正确的话,您可以将表 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(...)
添加列。因此,此代码只是删除 exdata3
的原始版本,然后从 data1
中的数据创建一个新副本。最后一行只是读回表格以证明它有效。
您的代码存在一些问题。
第一次尝试失败,因为您传递的是变量名 exdata3
,而不是字符串 "exdata3"
。您的 R 环境中没有名为 exdata3
的变量,因此出现错误:“找不到对象 'exdata3'”。
第二次尝试失败,因为您告诉 ODBC 驱动程序将数据帧的行名称保存在名为 diffhighlow
的列中,但 data1
中已经有一列该名称,因此驱动程序正在尝试创建具有相同名称的两列。
第三次尝试失败,因为 exdata3
中的列未映射到 data1
中的列。
关于mysql - 如何使用 RODBC 将数据帧添加到 mysql 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25663247/