2017-05-07 24 views
2

連接到本地Postgres數據庫與R問題我要下面的代碼通過RPostgreSQL

drv <- RPostgreSQL::PostgreSQL() 
con <- DBI::dbConnect(drv, dbname = 'dbname', user = 'user', 
         host = 'host.name', port = 5432, password = 'password') 

當我在服務器上運行它(Ubuntu的服務器16.04與最新更新)上運行我得到以下錯誤的數據庫:

Error in .valueClassTest(ans, "data.frame", "dbGetQuery") : 
    invalid value from generic function ‘dbGetQuery’, class 「NULL」, expected 「data.frame」 

但是當我使用sudo從命令行運行R時,它起作用,當我從不同的筆記本電腦運行它時,它連接到服務器上的數據庫時也起作用。所以它不應該是連接問題。我正在考慮對系統上某些庫/可執行文件/配置文件的訪問權限問題?任何幫助將不勝感激。

當運行dbConnect多次,並將其與錯誤結束,當我運行drv_info <- RPostgreSQL::dbGetInfo(drv),我仍然獲得多個connectionIds在drv_info

drv_info <- RPostgreSQL::dbGetInfo(drv) 
> drv_info 
$drvName 
[1] "PostgreSQL" 

$connectionIds 
$connectionIds[[1]] 
<PostgreSQLConnection> 

$connectionIds[[2]] 
<PostgreSQLConnection> 

$fetch_default_rec 
[1] 500 

$managerId 
<PostgreSQLDriver> 

$length 
[1] 16 

$num_con 
[1] 2 

$counter 
[1] 2 
+0

此外,當我運行在同一臺服務器上運行的rstudio服務器的命令時,連接將起作用。 – JaKu

+0

根據源主機,Postgres具有不同的身份驗證機制。可能是因爲您要連接的主機名解析爲服務器上的127.0.0.1或127.1.0.1,這就要求只有特定的用戶才能連接。嘗試硬編碼外部IP地址。 – r2evans

+0

我認爲問題出在連接後的某個地方,因爲當我嘗試使用不同的密碼(在127.0.0.1或外部IP上)時,我得到了不同的錯誤: '在postgresqlNewConnection(drv,...)中出錯:' 'RS-DBI driver :(不能連接用戶名@主機上的dbname「dbname」' – JaKu

回答

1

實測值混亂的一個來源,但不一定是根問題。 (我)假設RPostgres,而你正在使用RPostgreSQLgithub mirror

如果您檢查源代碼,你會發現,該方法是調用postgresqlNewConnection,這includes a call to dbGetQuery。您看到的問題是您撥打dbConnect失敗(我的猜測是line 100),並返回一些意外,但postgresqlNewConnection繼續。

我看到三個選項供您:

  • 嘗試調用dbConnect(..., forceISOdate=FALSE)繞過一個調用dbGetQuery(注意,這不能解決連接問題,但它至少不會給你意想不到的查詢連接嘗試錯誤);
  • raise an issue爲包維護者;或
  • 開關使用RPostgres,仍然DBI爲基礎,積極開發(它看起來像RPostgreSQL在過去的幾年裏一直沒有顯著提交,不知道這是好代碼穩定性或發育停滯的標誌)

您可以從中獲得一個教訓,那就是您應該檢查從dbConnect返回的值;如果is.null(con),有什麼不對。 (同樣,這並不能解決連接問題。)

+1

'''forceISOdate = FALSE'''是關鍵! '''CON < - 數據庫連接(DRV,則dbname = 'about_psql', 主機= '本地主機',端口= 5432, 用戶= 'TheDonald',口令= '資料Tweet!',forceISOdate = FALSE) ' '' –

+0

哦,是的!我的目的只是爲了展示我的例子,它是由「forceISOdate」修復的。 –