当前位置: 首页 > 知识库问答 >
问题:

如何使用RODBC向mysql表添加dataframe

龚俊捷
2023-03-14

我最初调用了数据库,并使用了Definer中的表,在它上运行一些查询,这些查询存储在dataframe'data1'中。现在我想发送包含一个新列的'data1',并更新MySQL中的非空表exdata3。

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

在MySQL中,dataframe和表之间的区别是在dataframe中增加了一列'DiffHighLow'(它包含从表中的另外两个Coulmn计算出的值)。

我正在使用RODBC在64位Windows7上实现R和MySQL之间的通信

我已经对随后的错误进行了以下尝试。

1.>sqlSave(channel、data1、exdata3、append=TRUE、rownames=“diffhighlow”、colnames=TRUE、verbose=FALSE、safer=TRUE、addPK=FALSE、integer、fast=TRUE、test=FALSE、nastring=NULL)

sqlSave中出错(通道、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)Driver][MySQLD-5.0.41-Community-nt]重复列名'Diffhighlow‘

[RODBC]错误:无法SQLExecDirect“创建表data1(diffhighlowvarchar(255)not NULL主键、exdata3_id整数、datedouble、opendouble、highdouble、highdouble、highdouble、shares_整数

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

sqlUpdate(channel,data1,“exdata3”)中的错误:数据帧列日期打开高打开低关闭shares_turnover_diffhighlow不在数据库表中

我不明白,除了'Diffhighlow‘之外,为什么不能识别数据库表中已经存在的行名

请指教。我已经搜索了很多这样的问题,并尝试了已经发布的各种解决方案(看起来与我的查询非常相似),但似乎没有一个有效。

共有1个答案

轩辕奕
2023-03-14

如果我理解正确的话,可以将表的内容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的变量,因此出现错误:“Object'exdata3'未找到”。

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

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

 类似资料:
  • 我需要创建dynamoDB表,然后根据开发、阶段和生产对它们进行分组。我在AWS控制台中找到了一个创建表组的选项,我们可以将表添加到组中。但是我需要使用AWS SDK将表添加到一个特定的组中,我检查了AWS DynamoDB SDK类列表我没有找到任何选项。

  • 作为一个具体的示例,假设我有一个工作簿和工作表,其中有一个从A1开始的2列2行(包括标题)的现有表。我可以打开底层的XL>Tables>Table1.xml并看到以下内容: 我可以看到我的两列、根标记的ref属性以及autoFilter块的ref属性。我想要做的是添加一个新行,这样表的面积将是A1:B3。

  • 如果是的话,我们能做吗? 在这里,我想从相同的MyObject对象getTestId中添加一个属性到列表中,有一种方法可以在上面的语句中添加吗?

  • 我有一个观察数据表和是和否的模型。为简单起见,我只假设对组。我浪费了一些分类统计数据,我想控制选择哪一个。我知道如何使用eval做到这一点并将其保存在另一个data.table中,但我想添加到现有的data.table中,因为我每个组只有一行。任何人都可以帮我吗? 首先,我为每个组创建列联表。 然后定义统计数据 如果我使用下面几行,它会给我一个新的数据表: 如何在此示例中使用:=将结果添加到我的旧

  • 那么,如何使用PySpark向现有的DataFrame添加一个新列(基于Python vector)呢?