使用sqldf和RPostgreSQL的结合

15

当使用RPostgreSQL时,我发现无法以相同的方式使用sqldf。例如,如果我加载库并使用以下代码将数据读入数据框:

library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host="localhost", user="postgres", password="xxx", dbname="yyy", port="5436")
rs <- dbSendQuery(con, "select * from table");                           
df<- fetch(rs, n = -1); dbClearResult(rs) 
dbDisconnect(con) 

我知道这个表格的内容存储在名为df的数据框中。不过,如果我想要使用sqldf运行SQL命令,我以前会像这样做:

sqldf("SELECT * FROM df WHERE X > 10")

这不再起作用了,因为我收到了错误消息:

Error in postgresqlNewConnection(drv, ...) : 
  RS-DBI driver: (could not connect postgres@localhost on dbname "test"
)
Error in !dbPreExists : invalid argument type

我想这可能是我的操作错误,但我无法弄清楚应该提供什么参数给sqldf,使它只关注数据框而不尝试连接其他任何内容。

2个回答

22

使用RPostgreSQL与sqldf

如果检测到已加载了RPostgreSQL,sqldf将自动与PostgreSQL中的test数据库一起工作。因此,您可以在PostgreSQL中创建一个test数据库,然后使用sqldf

或者,您可以指定不同数据库的名称。

请参见:sqldf FAQ 12

使用RSQLite与sqldf

如果要使用RSQLite而不是RPostgreSQL与sqldf一起使用,您可以使用sqldfdrv参数来强制它使用非默认驱动程序。例如:

sqldf("select foo from bar...",drv="SQLite")

或者,您可以使用"sqldf.driver"选项全局设置驱动程序。在R内部实现:

options(sqldf.driver = "SQLite")
或者,如果您想使用RSQLite,另一种可能性是在使用sqldf之前detach RPostgreSQL,然后再次加载它。
有关详细信息,请参见?sqldf

7

我遇到了同样的错误,我卸载了RPostgreSQL包,重新运行我的sqldf代码,然后它正常工作了 r detach("package:RPostgreSQL", unload=TRUE)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接