在r中使用sqldf时无法连接数据库

时间:2016-07-17 00:01:56

标签: r sqldf

我将一个csv文件加载到我的R中,当我尝试使用sqldf选择一些列时,它总是转到

Error in .local(drv, ...) : 
  Failed to connect to database: Error: Access denied for user 
  'User'@'localhost' (using password: NO)
Error in !dbPreExists : invalid argument type

我不知道如何修复它。

这是我的剧本:

library("RMySQL")
library(sqldf)
acs<-read.csv("getdata_data_ss06pid.csv",head = T)
sqldf("select pwgtp1 from acs where AGEP < 50")

2 个答案:

答案 0 :(得分:13)

在使用RMySQL时,您似乎不需要加载sqldf库,因为您已经将数据读入内存,这似乎是问题所在:

library(RMySQL)
library(sqldf)
sqldf("select * from df limit 6")
  

.local(drv,...)出错:         无法连接到数据库:错误:无法通过socket&#39; /tmp/mysql.sock'连接到本地MySQL服务器; (2)       错误!dbPreExists:无效的参数类型

但是,如果RMySQL库已分离,则sqldf有效:

detach("package:RMySQL", unload=TRUE)
sqldf("select * from df limit 6")
#   time  type
# 1    1 type1
# 2    2 type1
# 3    3 type2
# 4    4 type1
# 5    5 type2
# 6    6 type1

答案 1 :(得分:6)

<强> TL; DR

在调用RMySql函数之前,显式将sqldf默认驱动程序选项设置为SQLite,而不是取消sqldf包的解码:

options(sqldf.driver = "SQLite")
sqldf("select * from df limit 6")

<强>解释

如果没有明确定义,sqldf包决定使用哪个DB驱动程序,如下所示:

  

如果未指定,则选中“dbDriver”选项,如果不是,则选中   然后设置sqldf检查RPostgreSQL,RMySQL或RH2是否   以该顺序加载并且驱动程序对应于第一个   发现是用的。如果没有加载,则使用“SQLite”。 DBNAME = NULL   导致默认使用。

在您的情况下,RMySql已经加载,sqldf将尝试使用MySQL DB并写入名为test的模式。分离和卸载RMySQL包是一种选择,但不是必需的。正如@GaborGrothendieck在评论中所提到的,最简单的解决方法是简单告诉sqldf明确使用哪个DB驱动程序,即

sqldf("select * from df limit 6", drv="SQLite")

要始终不必添加drv="SQLite",您可以将会话的默认驱动程序永久设置为SQLite

options(sqldf.driver = "SQLite")