sqlSave 在 R 中创建数据框并将其保存到 sql 表

Posted

技术标签:

【中文标题】sqlSave 在 R 中创建数据框并将其保存到 sql 表【英文标题】:sqlSave in R to create and save a dataframe to an sql table 【发布时间】:2014-02-21 12:29:47 【问题描述】:

您好,我正在使用 R 将数据框保存到 DB2 SQL 表中。我似乎能够创建表格骨架,但不能将数据附加到表格中-

>df <- read.csv("dat.csv")

其中 dat.csv 是没有标题的 csv,只有两列中的原始数据

然后我创建表:

>sqlQuery(channel, "create table sqltable 
                   (
                   col1  int,
                   col2  float
                   )"
         (

我确认表是通过在数据库中选择空表“sqltable”来创建的

所以现在我需要将“dat.csv”中的数据添加到“sqltable”中:

>sqlSave(channel, df, "sqltable", verbose=T, fast=T, append=T)

no: 1 rownames 1/***/no: 2 col1 31105/***/no: 3 col2 0.001/***/
no: 2 rownames 1/***/no: 2 col1 31106/***/no: 3 col2 0.023/***/
no: 3 rownames 1/***/no: 2 col1 31107/***/no: 3 col2 1.456/***/
no: 4 rownames 1/***/no: 2 col1 31108/***/no: 3 col2 0.001/***/
no: 5 rownames 1/***/no: 2 col1 31109/***/no: 3 col2 2.102/***/

一切似乎都很好,直到我这样做:

>sqlQuery(channel,"select * from sqltable")

[1] COL1     COL2
<0 rows> or 0-length row.names

sqlSave命令明明是从dat.csv中取出数据的,为什么没有加到表中呢?我做错了什么?

【问题讨论】:

我对@9​​87654325@一无所知,但是您的插入是否必须COMMIT,否则它会自动回滚? 您使用什么类型的连接,您的 DB2 服务器在什么类型的操作系统上运行? 【参考方案1】:

最好在 sqlSave 中定义 varTypes。这是我的做法。 :-)

columnTypes <- list(ColumnName="varchar(255)", NumberColumn="float", datecolumn="date")

这为您的数据定义了列类型,因此您可以在 sqlSave 中添加参数。所以现在让我们执行 sqlSave。

sqlSave(channel, YourTable, rownames = FALSE, varTypes = columnTypes)

如果表已经添加,那么我会在此之前执行 sqlDrop。

为什么这是一个答案?

好吧,我也遇到了同样的问题。我收到一条错误消息,说它无法执行 sqlSave,但它正在将我的列放入数据库中。所以我不得不修复 columnTypes。 R 尝试手动完成,但并不完美。 :-)

【讨论】:

【参考方案2】:

在您的sqlSave() 中使用rownames = FALSE

由于您没有提供来自 dat.csv 的数据样本,我假设它有 2 列,基于您的 sqlSave 代码块。从您的 create 语句中, sqltable 只有 2 列; sqlSave 默认为rownames = TRUE,这将使您从数据框中输入的数据有 3 列,而不是您想要的 2 列。通过尝试将 3 列放入包含 2 列而没有 rownames = FALSE 的 Microsoft SQL Server 表中,我的 R 会话因致命错误而中止。

【讨论】:

我遇到了一个错误,"Error in cbind_all(x) : Argument 1 must have names". 设置 rownames = F 修复了错误或我 @Nova,如果您想弄清楚在 R 中使用什么 ODBC 连接器,我建议使用 DBI 而不是 RODBC 。 DBI 允许对使用的模式进行更精细的控制,而 RODBC 的 sqlSave 只使用默认模式。 DBI 也可能比 RODBC 拥有更多活跃的开发人员。 谢谢贾里德,这太周到了!

以上是关于sqlSave 在 R 中创建数据框并将其保存到 sql 表的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中创建文件并将其上传到 FTP 服务器而不在本地保存

来自 RODBC 的 sqlSave 仅在 R 中保存日期的年份

如何将 sqlSave 函数与 R 中的现有表一起使用

RODBC sqlSave() 和映射列名

如何使用 R 中的函数 sqlSave() 将数据附加到具有 IDENTITY 主键的 SQL Server 表中?

如何使用unity3d在Windows Phone的内部存储中创建文件并将其保存到目录中