sqldf 可以用于将数据库中已存在的 table 的数据导入 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?
今天,我第一次发现 sqldf 包,我发现它非常有用和方便。以下是文档对包的描述:
https://www.rdocumentation.org/packages/sqldf/versions/0.4-11
sqldf is an R package for runing SQL statements on R data frames,
optimized for convenience. The user simply specifies an SQL statement
in R using data frame names in place of table names and a database
with appropriate table layouts/schema is automatically created, the
data frames are automatically loaded into the database, the specified
SQL statement is performed, the result is read back into R and the
database is deleted all automatically behind the scenes making the
database's existence transparent to the user who only specifies the
SQL statement.
所以如果我没理解错的话,一些data.frame里面的数据存储在电脑的RAM中,临时映射到磁盘上的一个数据库中作为table,然后计算什么的查询应该做的将完成,最后结果返回给 R,所有在数据库中临时创建的东西都消失了,因为它从未存在过。
我的问题是,反之亦然吗?意思是,假设数据库中已经有一个 table 命名为 my_table
(只是一个例子)(我使用 PostgreSQL),有没有办法将其数据从数据库导入到 data.frame 在 R 中通过 sqldf?因为,目前我知道的唯一方法是RPostgreSQL。
感谢 G. Grothendieck 的回答。实际上,完全有可能 select 来自数据库中现有 table 的数据。我的错误是我认为数据帧的名称和相应的 table 必须始终相同,而如果我理解正确的话,只有当 data.frame 数据映射到 a 时才会出现这种情况数据库中的临时 table。结果,当我尝试 select 数据时,我收到一条错误消息,指出我的数据库中已存在同名的 table。
无论如何,只是为了测试这是否有效,我在 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 包含存储在 table 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 包,我发现它非常有用和方便。以下是文档对包的描述:
https://www.rdocumentation.org/packages/sqldf/versions/0.4-11
sqldf is an R package for runing SQL statements on R data frames, optimized for convenience. The user simply specifies an SQL statement in R using data frame names in place of table names and a database with appropriate table layouts/schema is automatically created, the data frames are automatically loaded into the database, the specified SQL statement is performed, the result is read back into R and the database is deleted all automatically behind the scenes making the database's existence transparent to the user who only specifies the SQL statement.
所以如果我没理解错的话,一些data.frame里面的数据存储在电脑的RAM中,临时映射到磁盘上的一个数据库中作为table,然后计算什么的查询应该做的将完成,最后结果返回给 R,所有在数据库中临时创建的东西都消失了,因为它从未存在过。
我的问题是,反之亦然吗?意思是,假设数据库中已经有一个 table 命名为 my_table
(只是一个例子)(我使用 PostgreSQL),有没有办法将其数据从数据库导入到 data.frame 在 R 中通过 sqldf?因为,目前我知道的唯一方法是RPostgreSQL。
感谢 G. Grothendieck 的回答。实际上,完全有可能 select 来自数据库中现有 table 的数据。我的错误是我认为数据帧的名称和相应的 table 必须始终相同,而如果我理解正确的话,只有当 data.frame 数据映射到 a 时才会出现这种情况数据库中的临时 table。结果,当我尝试 select 数据时,我收到一条错误消息,指出我的数据库中已存在同名的 table。
无论如何,只是为了测试这是否有效,我在 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 包含存储在 table 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
>
>