【问题标题】:Error in dbDriver("PostgreSQL") : could not find function "dbDriver"dbDriver(“PostgreSQL”)中的错误:找不到函数“dbDriver”
【发布时间】:2019-05-02 23:27:40
【问题描述】:

我在 Amazon Web Services 实例上设置了一个闪亮的服务器,我正在尝试将我的 app.R 安装到它上面,但出现此错误:

Error in dbDriver("PostgreSQL") : could not find function "dbDriver"
Calls: runApp ... sourceUTF8 -> eval -> eval -> ..stacktraceon.. -> get_query
Execution halted

我认为这与软件包 DBI 的库安装有关,但我尝试在实例上再次安装它并没有成功。 不知道接下来要尝试什么..

这是错误的全图,我可以添加所需的任何其他信息:

我还可以确认闪亮服务器安装正确,因为此页面正常加载:

这就是我尝试在实例中安装包的方式:

sudo su - -c "R -e \"install.packages(c('shiny', 'shinythemes', 'shinycssloaders', 'dplyr', 'xlsx','ggplot2','ggthemes','DT','stringr','RPostgreSQL','tidyr','dbplyr', DBI','splitstackshape'), repos='http://cran.rstudio.com/')\""

而 dbDriver 是 DBI 包中的一个函数

这是我的 app.R 代码包含的部分内容:

required_packages <- c("shiny", "shinythemes", "shinycssloaders", "dplyr", "xlsx","ggplot2","ggthemes","DT","stringr","RPostgreSQL","tidyr","dbplyr","DBI","splitstackshape"
                       ,"magrittr","tidyverse","shinyjs","data.table","plotly")
absent_packages <- required_packages[!(required_packages %in% installed.packages()[,"Package"])]
if(length(absent_packages)) install.packages(absent_packages)
set.seed(1)

get_query <- function(querystring){
  # create a connection

  # loads the PostgreSQL driver
  drv <- dbDriver("PostgreSQL")
  # creates a connection to the postgres database
  # note that "con" will be used later in each connection to the database
  con <- dbConnect(drv, dbname = "postgres",  host = "/var/run/postgresql", port = 5432, user = "postgres", password = "pw")
  on.exit(dbDisconnect(con))
  #rstudioapi::askForPassword("Database password")

  query <- eval(parse(text = querystring))
  return(query)
}

这些是同一实例上的 postgreSQL 数据库的表和连接信息:

如果我在 dbConnect() 和 dbDisconnect() 前面添加 DBI:: 并使用 RPostgres::Postgres() 作为 dbConnect 函数中的驱动程序,我会收到以下错误:

【问题讨论】:

  • 请让这个问题可重现。这包括示例代码(包括列出非基础 R 包)。参考:stackoverflow.com/questions/5963269stackoverflow.com/help/mcvestackoverflow.com/tags/r/info
  • 老实说,我不确定如何使这个可重现,因为我认为这与我的实例设置有关。我应该添加已安装的库吗?我已经在我的实例上设置了一个 postgreSQL 数据库和闪亮服务器,所以我希望其他人以前看到过这个错误并且知道它的含义。

标签: r postgresql shiny


【解决方案1】:

安装一个包并不意味着它被加载到你的命名空间中。此外,不推荐使用dbDriver,如?dbDriver所示:

这些方法已弃用,请查阅各个后端的文档以构建驱动程序实例。

我建议在每次调用其函数时显式加载DBI 或使用DBI::(无论如何这不是一个坏主意):

library(DBI)
get_query <- function(querystring){
  # create a connection
  # save the password that we can "hide" it as best as we can by collapsing it

  # creates a connection to the postgres database
  # note that "con" will be used later in each connection to the database
  con <- DBI::dbConnect(RPostgres::Postgres(), dbname = "postgres",  host = "/var/run/postgresql", port = 5432, user = "postgres", password = "pw")
  on.exit(DBI::dbDisconnect(con))
  #rstudioapi::askForPassword("Database password")

  query <- eval(parse(text = querystring))
  return(query)
}

(同样,您不需要同时使用library(DBI) 和使用DBI::,您可以选择。)

我在这里使用了RPostgres::Postgres(),但这也适用于许多其他驱动程序,包括RPostgreSQL::PostgreSQL()RSQLite::SQLite()rodbc::odbc()(还有几个)。

进一步的点,虽然我不知道你还有什么可以确定的:

  • 每次调用此函数时建立连接会变得“昂贵”;考虑在此函数之外连接并传入您的 con 对象;如果这是一两次的事情,那么您可能会没事;
  • eval(parse(...)) 的使用似乎是错误的……执行用户提供的查询非常危险,如果您不熟悉,请查看“SQL 注入”。为什么不只是DBI::dbGetQuery(con, querystring)

【讨论】:

  • 我尝试添加 DBI:: 并使用 RPostgres::Postgres() 作为驱动程序,现在我收到另一个错误,看起来有点类似于第一个错误(将其添加到我上面的问题中)。最后几点是很好的建议,我会研究一下,谢谢!
  • 不要使用dbDriver。你不需要它。它已被弃用:每个后端驱动程序“应该提供一个与包同名的导出对象”(来自?dbDriver)。但如果坚持,试试DBI::dbDriver("Postgres")(但真的,不要)。
  • 哦,对不起,我的意思是 dbConnect 和 dbDisconnect,我会修复它
  • 终于搞定了,我没有安装库RPostgres...愚蠢的错误!
  • 还有RPostgreSQL,目的相同,大体相同,作者不同,代码路径不同。
猜你喜欢
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 2022-09-28
  • 2019-12-20
相关资源
最近更新 更多