【问题标题】:Failed to connect the database when using sqldf in r在r中使用sqldf时连接数据库失败
【发布时间】:2016-11-19 21:07:29
【问题描述】:

我将一个 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”?
  • 请参阅?sqldf 并阅读dbname 参数、drv 参数的描述以及参考部分上方以“On MySQL...”开头的两段跨度>

标签: r sqldf


【解决方案1】:

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

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

.local(drv, ...) 中的错误: 连接数据库失败:错误:无法通过套接字'/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

【讨论】:

    【解决方案2】:

    TL;DR

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

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

    说明

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

    如果未指定,则选中“dbDriver”选项,如果未指定 set then sqldf 检查 RPostgreSQL、RMySQL 或 RH2 是否是 按该顺序加载,驱动程序对应于第一个 发现被使用。如果没有加载,则使用“SQLite”。数据库名=NULL 导致使用默认值。

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

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

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

    options(sqldf.driver = "SQLite")
    

    【讨论】:

    • 这似乎是最佳选择,尤其是对于更大或更复杂的脚本,您可能还需要RMySQL 或其他数据库驱动程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2023-03-02
    • 2020-05-05
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多