可以使用sqldf将数据库中已经存在的表的数据导入R中的data.frame吗?

Posted

技术标签:

【中文标题】可以使用sqldf将数据库中已经存在的表的数据导入R中的data.frame吗?【英文标题】:Can sqldf be used to import the data of an already existing table in a database into a data.frame in R? 【发布时间】:2021-09-30 23:37:39 【问题描述】:

今天,我第一次发现 sqldf 包,我发现它非常有用和方便。以下是文档对软件包的说明:

https://www.rdocumentation.org/packages/sqldf/versions/0.4-11

sqldf 是一个 R 包,用于在 R 数据帧上运行 SQL 语句, 为方便而优化。用户只需指定一条 SQL 语句 在 R 中使用数据框名称代替表名和数据库 使用适当的表格布局/模式会自动创建, 数据框自动加载到数据库中,指定的 执行 SQL 语句,结果被读回 R 和 数据库在幕后被自动删除 数据库的存在对只指定 SQL 语句。

因此,如果我理解正确,一些包含存储在计算机 RAM 中的数据的 data.frame 将作为表临时映射到磁盘上的数据库中,然后进行计算或查询应该执行的任何操作最后将结果返回给 R,数据库中临时创建的所有内容都消失了,因为它从未存在过。

我的问题是,它可以以其他方式工作吗?意思是,假设在数据库(我使用 PostgreSQL)中已经有一个名为 my_table 的表(只是一个例子),有没有办法通过 sqldf?因为,目前我知道的唯一方法是 RPostgreSQL。

【问题讨论】:

您可以运行 select 语句来检索数据。 ?sqldf 和github.com/ggrothendieck/sqldf的FAQ#12 中有信息 非常感谢您的宝贵时间和帮助。有用!我解释了(见下面的答案)哪里出错了。 【参考方案1】:

感谢 G. Grothendieck 的回答。事实上,从数据库中已经存在的表中选择数据是完全可能的。我的错误是我认为数据框的名称和对应的表必须始终相同,而如果我理解正确的话,只有当 data.frame 数据映射到数据库中的临时表时才会出现这种情况。结果,当我尝试选择数据时,我收到一条错误消息,提示我的数据库中已经存在同名的表。

无论如何,作为测试是否可行,我在 PostgreSQL(postgres 用户和 postgres 拥有的 test 数据库)中执行了以下操作

test=# create table person(fname text, lname text, email text);
CREATE TABLE
test=# insert into person(fname, lname, email) values ('fname-01', 'lname-01', 'fname-01.lname-01@gmail.com'), ('fname-02', 'lname-02', 'fname-02.lname-02@gmail.com'), ('fname-03', 'lname-03', 'fname-03.lname-03@gmail.com');
INSERT 0 3
test=# select * from person;
  fname   |  lname   |            email            
----------+----------+-----------------------------
 fname-01 | lname-01 | fname-01.lname-01@gmail.com
 fname-02 | lname-02 | fname-02.lname-02@gmail.com
 fname-03 | lname-03 | fname-03.lname-03@gmail.com
(3 rows)

test=# 

然后我在R中写了以下内容

options(sqldf.RPostgreSQL.user = "postgres", 
  sqldf.RPostgreSQL.password = "postgres",
  sqldf.RPostgreSQL.dbname = "test",
  sqldf.RPostgreSQL.host = "localhost", 
  sqldf.RPostgreSQL.port = 5432)
###
###
library(tidyverse)
library(RPostgreSQL)
library(sqldf)
###
###
result_df <- sqldf("select * from person")

我们确实可以看到 result_df 包含存储在 person 表中的数据。

> result_df
     fname    lname                       email
1 fname-01 lname-01 fname-01.lname-01@gmail.com
2 fname-02 lname-02 fname-02.lname-02@gmail.com
3 fname-03 lname-03 fname-03.lname-03@gmail.com
> 
> 

【讨论】:

以上是关于可以使用sqldf将数据库中已经存在的表的数据导入R中的data.frame吗?的主要内容,如果未能解决你的问题,请参考以下文章

对已经存在的hbase表修改压缩方式

怎么将Excel中的数据导入到 oracle中

Delphi 中如何将EXCEL表导入到已知的数据库中,再进行操作

为已经填充的表获取 SQL? PHPMyAdmin

查询在一张表不在另外一张表的记录及效率探究

怎么将MySQL里的表数据导入到SqlServer里面