9

我在使用 RODBC 将数据框插入 mySql 数据库时遇到了一些困难。下面是我正在使用的代码:

data <- data.frame(analysedDataID=c(1,2,3), plateWell=c("a","b","c"), screenPlateOrder=c(1,2,3), wellData=c("A","B","C"))

con <- odbcConnect(DSN, uid="user_id", pwd="some_password")
query <- sqlSave(con, data, tablename = 'wellAnalysedDataTable', rownames=FALSE, append=TRUE)

当我尝试执行此操作时,我收到以下错误消息:

Error in odbcUpdate(channel, query, mydata, coldata[m, ], test = test,  : 
missing columns in 'data'

这是我尝试将数据插入到的特定表:

+------------------+-------------+------+-----+---------+-------+
| Field            | Type        | Null | Key | Default | Extra |
+------------------+-------------+------+-----+---------+-------+
| analysedDataID   | int(10)     | YES  |     | NULL    |       | 
| plateWell        | varchar(10) | YES  |     | NULL    |       | 
| screenPlateOrder | int(10)     | YES  |     | NULL    |       | 
| wellData         | varchar(30) | YES  |     | NULL    |       | 
+------------------+-------------+------+-----+---------+-------+

在这一点上,我真的很困惑,因为我一遍又一遍地阅读文档,但无法让它工作。任何帮助将不胜感激!

干杯!


谢谢!我添加了您建议的更改,并且该案例似乎不再存在问题。但是我不断收到以下错误消息:

'index column(s) analysedDataID plateWell screenPlateOrder wellData not in data frame'

我正在执行的生成此语句的语句是:

sqlUpdate(con, data, tablename="wellAnalysedDataTable", index=c("analysedDataID", "plateWell", "screenPlateOrder", "wellData"))

这对我来说没有任何意义,因为列已经在具有相同列名的数据框中。

4

6 回答 6

20

我知道非常老的问题,但我刚刚(并为我的实例解决了)同样的问题,得到了这个错误

Error in odbcUpdate(channel, query, mydata, coldata[m, ], test = test,  : 
  missing columns in 'data'

从使用

sqlSave(

在rodbc 包中。

我通过设置解决了

,fast = F

如果第一个谷歌结果中的其他人在这里登陆,希望这会有所帮助

编辑:所以我已经看了更多。按照我在下面的建议将标志设置为“F”时,您将行逐行插入到数据库中。虽然它是“T”,但如果一行不正确,它会失败,但现在那一行失败了,你不知道。因此,数据库可能缺少您认为存在的数据。检查数据库中的行数与您希望从数据框中插入的行数。您可能有一个不兼容的值。我现在要做的是在循环中使用“粘贴”函数来创建一个像“插入表名值(“eg1”,“eg2”)”这样的字符串,这样我就可以得到错误消息,说明为什么它没有去进入数据库

于 2016-08-15T16:37:46.707 回答
2

不同的错误可能导致相同的错误消息。所以不清楚这是否对您有帮助:但是,如果“tablename='wellAnalysedDataTablealready”已经在 mySql 数据库中创建为空表,您将收到此错误。尝试删除它并让 sqlsave(...) 函数执行照顾它

于 2014-01-10T14:26:22.650 回答
2

我得到了同样的错误,问题是目标表数据类型。即使看起来有可能的数据转换。
解决的步骤是:

  1. 使用未使用的表名(新表);
  2. 设置 append=False 并获取错误消息中显示的“创建表”;
  3. 运行在数据库中创建表;
  4. “saveSql”现在可以使用 append=False 或 append=True。

设置“verbose=T”有助于准确检查问题发生的位置。

于 2016-06-27T20:57:01.467 回答
1

前段时间我处于同样的情况,我的问题是插入与目标表中的列不匹配的数据框列号。所以这就是我所做的。我使用附加设置为 false 进行了 SQL 保存(这意味着创建一个名称与有问题的表不同的新表)。使用工作数据库的 INFORMATION_SCHEMA.COLUMNS 的 table_name 和 column_name 我比较了两个表以确定缺少的列。

select * from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='table1'
and COLUMN_NAME NOT IN
(
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='table2'
)

您可以互换使用 table1 和 table2。一个是 sqlsave 失败的表,而另一个是动态创建的表

于 2020-12-26T07:10:45.453 回答
0
> str(data)
'data.frame':   3 obs. of  4 variables:
 $ analysedDataID  : num  1 2 3
 $ plateWell       : Factor w/ 3 levels "a","b","c": 1 2 3
 $ screenPlateOrder: num  1 2 3
 $ wellData        : Factor w/ 3 levels "A","B","C": 1 2 3

你试过让你的数字整数和你的因子字符吗?

 data <- data.frame(analysedDataID=as.integer(c(1,2,3)), plateWell=c("a","b","c"), screenPlateOrder=as.integer(c(1,2,3)), wellData=c("A","B","C"),stringsAsFactors=FALSE)
于 2011-08-02T10:44:08.767 回答
0

如果问题实际上与区分大小写有关,那么使用“preserve”选项似乎可以轻松解决问题,而无需更改任何功能,该选项出现在 Ari B. Friedman 指出的行中:“nochange=cnames”。因此,当您最初创建 RODBC 通道时,您可以简单地将其指定为 case 选项:

my_sql_channel <<- odbcConnect("myOdbc", case="nochange")
于 2015-08-15T14:36:15.393 回答