sqldf 可以用于将数据库中现有表的数据导入到 R 中的 data.frame 中吗?

问题描述

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

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

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

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

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

解决方法

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

无论如何,为了测试这是否有效,我在 PostgreSQL 中做了以下操作(postgres 用户和 test 由 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
> 
> 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...