dbDriver(“ PostgreSQL”)中的错误:找不到函数“ dbDriver”

时间:2018-11-30 19:32:25

标签: r postgresql shiny

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

    Ray ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, actionRange))
{
    goChildren.Remove(hit.transform.gameObject);
    Destroy(hit.transform.gameObject);
}

我认为这与软件包DBI的库安装有关,但是我尝试在实例上再次安装它,但未成功。 不知道下一步该怎么做。

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

enter image description here

我也可以确认Shiny-server安装正确,因为此页面正常加载:

enter image description here

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

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

并且dbDriver是DBI软件包中的一个函数

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

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/')\""

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

如果我在dbConnect()和dbDisconnect()前面添加DBI ::,并在dbConnect函数中使用RPostgres :: Postgres()作为驱动程序,则会出现此错误: enter image description here

1 个答案:

答案 0 :(得分: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 Injection”。为什么不只是DBI::dbGetQuery(con, querystring)