mysql - 如何使用 RODBC 将数据帧添加到 mysql 表

标签 mysql r dataset addition deducer

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/

相关文章:

mysql - 将一个表中的多条记录插入到另一个表中

mysql - 导入 mysqldump 文件不匹配

c# - 为什么 ReadXmlSchema 创建额外的 "ID"列

python - 在 pandas 中过滤、分组和计数?

java - 防止Java中具有多个字段的重复数据集

mysql - 如何拥有一个包含多个主键的表?

mysql - 使用准备好的语句插入多行

java - 从 Java 执行时,R 脚本无法读取 .Rda 文件

r - 如何检查文件是否在R中被压缩

r - 在列表列中追加缺失的项目