Ошибка в dbDriver («PostgreSQL»): не удалось найти функцию «dbDriver» - PullRequest
0 голосов
/ 30 ноября 2018

У меня установлен блестящий сервер на экземпляре Amazon Web Services, я пытаюсь вставить на него свое приложение. R, но получаю эту ошибку:

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

Я думаю, что это нужно сделатьс установкой библиотеки DBI пакета, но я попытался установить его снова на экземпляр и не увенчался успехом.Не уверен, что попробовать дальше ..

Вот полное изображение ошибки, и я могу добавить любую другую необходимую информацию:

enter image description here

Также я могу подтвердить, что сервер глянцевый установлен правильно, потому что эта страница загружается нормально:

enter image description here

Вот как я пытался установить мойпакеты в экземпляре:

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 в том же экземпляре: enter image description here

Если я добавлю DBI :: перед dbConnect () и dbDisconnect () и буду использоватьRPostgres :: Postgres () в качестве драйвера в функции dbConnect Я получаю эту ошибку: enter image description here

1 Ответ

0 голосов
/ 30 ноября 2018

Установка пакета не означает, что он загружен в ваше пространство имен.Кроме того, использование 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)?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...