使用R中的sqldf时无法连接到数据库

10
我将一个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")

你能在问题中添加 head(acs) 的输出吗?为什么你需要使用 "RMySQL"? - Bulat
请查看 ?sqldf,并阅读关于 dbname 参数、drv 参数以及参考文献部分上面的第二段开始于“在MySQL上...”的描述。 - G. Grothendieck
2个回答

17

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

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

Error in .local(drv, ...) : 连接数据库失败:错误:无法通过套接字'/tmp/mysql.sock'(2)连接到本地MySQL服务器 Error in !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

15

简而言之:

在调用sqldf函数之前,不要卸载RMySql包,而是显式地将sqldf默认驱动程序选项设置为SQLite

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

解释

如果没有明确指定,sqldf 包将按照以下方式决定使用哪个数据库驱动程序:

如果未指定,则会检查 "dbDriver" 选项,如果未设置,则 sqldf 按顺序检查是否已加载 RPostgreSQL、RMySQL 或 RH2,并使用找到的第一个相应的驱动程序。如果没有加载任何驱动程序,则使用 "SQLite"。dbname=NULL 会使用默认值。

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

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

为了不必每次都添加 drv="SQLite",您可以永久设置会话的默认驱动程序为 SQLite

options(sqldf.driver = "SQLite")

这似乎是最佳选择,特别是对于更大或更复杂的脚本,您可能还需要 RMySQL 或其他 DB 驱动程序。 - NilsH

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