3

データベースへのパスワードをpgpass.confファイルに保存しています。RPostgresパスワードを指定せずにR からデータベースに接続しているためpgpass.conf、次のようにから読み取られます。

con <- dbConnect(RPostgres::Postgres(), 
                 dbname = "dbname",
                 user = "username",
                 host = "localhost",
                 port = "5432")

通常は完全に機能しますが、光沢のあるアプリからデータベースに接続しようとすると機能しません。接続定義は上記とまったく同じで、server.Rスクリプトに配置されます。デフォルトの引数で Shiny アプリを実行すると、エラーが発生します。

FATAL:  password authentication failed for user "username"
password retrieved from file "C:\Users\...\AppData\Roaming/postgresql/pgpass.conf"

接続定義でパスワードが明示的に指定されている場合:

con <- dbConnect(RPostgres::Postgres(), 
                 dbname = "dbname",
                 user = "username",
                 host = "localhost",
                 password = "mypass",
                 port = "5432")

すべてが機能します。

奇妙なことに、光沢のあるポートが次のような値に設定されている場合、shiny::runApp(port = 4000)パスワードを指定せずに接続が確立されますが、最初の場合のみです。つまり、同じ R セッションでアプリを閉じて再度開くと、エラーが発生します。また。

パッケージ「RPostgreSQL」をテストしました-どちらも機能しません。エラーメッセージのみが異なります。

Error in postgresqlNewConnection(drv, ...) : 
  RS-DBI driver: (could not connect postgres@localhost on dbname "dbname")

私は 32 ビットの R を使用していますが、64 ビットでテストしたところ、同じでした。Shiny アプリは、ブラウザー (Chrome) と Rstudio Viewer の両方で実行されました。

ここに私のセッション情報:

R version 3.2.2 (2015-08-14)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=Polish_Poland.1250  LC_CTYPE=Polish_Poland.1250        LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C                   LC_TIME=Polish_Poland.1250    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RPostgres_0.1  DBI_0.3.1.9008 shiny_0.12.2  

loaded via a namespace (and not attached):
[1] R6_2.1.1         htmltools_0.2.6  tools_3.2.2      rstudioapi_0.3.1     Rcpp_0.12.1.3    jsonlite_0.9.17  digest_0.6.8    
[8] xtable_1.7-4     httpuv_1.3.3     mime_0.4         RPostgreSQL_0.4
4

2 に答える 2

2

Shiny とシステム R GUI の間でコマンドが実行される環境には、おそらく何か異なるものがあります。これを回避するには、資格情報をRenviron ファイルに保存します。

readRenviron("~/.Renviron")
con <- dbConnect(RPostgres::Postgres(), 
                 dbname = Sys.getenv('pg_db'),
                 user = Sys.getenv('api_user'),
                 ...)

つまり、ステージング環境と本番環境で別々の Renviron を維持できるということです。これにより、スクリプトcommandArgs()で を使用して、使用する DB 資格情報を指定できます。

#!/usr/bin/env Rscript
environ_path <- switch(commandArgs(),
                  'staging' = {"~/staging.Renviron"},
                  'production' = {"~/production/Renviron"})

readRenviron(environ_path)

次に、BASH から:

Rscript analysis.R staging
于 2015-12-01T17:52:24.373 に答える