首页 > 解决方案 > 可以使用sqldf将数据库中已经存在的表的数据导入R中的data.frame吗?

问题描述

今天,我第一次发现了sqldf包,我发现它非常有用和方便。以下是文档中有关该软件包的内容:

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

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

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

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

标签: rpostgresqlsqldf

解决方案


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

无论如何,作为测试是否可行,我在 PostgreSQL 中做了以下操作(postgres用户和测试数据库,它属于 postgres)

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
> 
> 

推荐阅读