在测试过程中检查r在不同环境中的不同连接凭据?

jjhzyzn0  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(105)

我不知道这是否是一个错误的配置设置我正在测试连接到不同的数据库网络设置。
虽然我正在测试设置,我希望应用程序能够运行三种不同的设置:
1.我在本地机器上的开发版本。
1.在使用Docker网络的部署空间上的独立Docker容器上。
1.在使用主机网络的部署空间中

  1. 2/3,但在shinyproxy容器设置中
    这些都有稍微不同的设置,但当我测试这些连接设置中的哪一个时。前三个工作,但2和3不工作。
    此外,2,3,和4共享相同的.Renviron文件,因为我希望能够创建设置,并让它使用第一个工作根据优先顺序的设置。这将使移交更容易,因为他们可以选择如何安全,使它。
    我正在使用RPostgres进行连接。
    我希望能够为每个设置使用相同的应用程序代码,但能够以不同的方式命名环境变量,以便为部署留下两个连接选项。
    这是我的计划,但似乎冗长。
    首先,使用不同的凭据测试所有连接,并将true false赋给一个变量。代码是从https://github.com/brry/berryFunctions/blob/master/R/is.error.R窃取的,用于错误测试。
admin_connect_error <-
  inherits(try(dbConnect(
    drv = RPostgres::Postgres(),
    dbname = Sys.getenv("ADMINDBNAME"),
    host = Sys.getenv("ADMINHOSTNAME"),
    port = Sys.getenv("ADMINPORTNAME"),
    user = Sys.getenv("ADMINUSERNAME"),
    password = Sys.getenv("ADMINPASSNAME")
  ),
  silent = TRUE)
  ,
  "try-error")

fake_connect_error <-
  inherits(try(dbConnect(
    drv = RPostgres::Postgres(),
    dbname = "db_name",
    host = "host_name",
    port = "port_name",
    user = "user_name",
    password = "pass_name"
  ),
  silent = TRUE)
  ,
  "try-error")

local_connect_error <-
  inherits(tryCatch(
    dbConnect(
      drv = RPostgres::Postgres(),
      dbname = Sys.getenv("USERDBNAME"),
      host = Sys.getenv("LOCHOSTNAME"),
      port = Sys.getenv("LOCPORTNAME"),
      user = Sys.getenv("USERUSERNAME"),
      password = Sys.getenv("USERPASSNAME")
    ),
    silent = TRUE
  ),
  "try-error")

docker_connect_error <-
  inherits(try(dbConnect(
    drv = RPostgres::Postgres(),
    dbname = Sys.getenv("USERDBNAME"),
    host = Sys.getenv("DOCKHOSTNAME"),
    port = Sys.getenv("DOCKPORTNAME"),
    user = Sys.getenv("USERUSERNAME"),
    password = Sys.getenv("USERPASSNAME")
  ),
  silent = TRUE)
  ,
  "try-error")

其次,检查哪些是正确的,并使用它来设置应用程序要使用的dbPool。

if (local_connect_error == F) {
  print("connection on local machine as host network")
  
  pool <- dbPool(
    drv = RPostgres::Postgres(),
    dbname =  Sys.getenv("USERDBNAME"),
    user = Sys.getenv("USERUSERNAME"),
    password = Sys.getenv("USERPASSNAME"),
    host =  Sys.getenv("LOCHOSTNAME"),
    port = Sys.getenv("LOCPORTNAME")
  )
  
} else if (docker_connect_error == F) {
  print("Connecting on docker network")
  
  pool <- dbPool(
    drv = RPostgres::Postgres(),
    dbname = Sys.getenv("USERDBNAME"),
    host = Sys.getenv("DOCKHOSTNAME"),
    port = Sys.getenv("DOCKPORTNAME"),
    user = Sys.getenv("USERUSERNAME"),
    password = Sys.getenv("USERPASSNAME")
  )
} else if (fake_connect_error == F) {
  print("connection on fake local machine as fake host network")
  
  pool <- dbConnect(
    drv = RPostgres::Postgres(),
    dbname = "db_name",
    host = "host_name",
    port = "port_name",
    user = "user_name",
    password = "pass_name"
  )
  
} else if (admin_connect_error == F) {
  print("connection on admin machine as host admin")
  
  pool <- dbConnect(
    drv = RPostgres::Postgres(),
    dbname = Sys.getenv("ADMINDBNAME"),
    host = Sys.getenv("ADMINHOSTNAME"),
    port = Sys.getenv("ADMINPORTNAME"),
    user = Sys.getenv("ADMINUSERNAME"),
    password = Sys.getenv("ADMINPASSNAME")
  )
  
}else{
  print("DB connection options not working - please debug")
}

这似乎很冗长,有更好的办法吗?

pb3s4cty

pb3s4cty1#

我把这个问题发布到ChatGPT上,得到了下面的答案--经过检查,这似乎是一个很好的解决方案。
是的,有一种更简单的方法可以实现这一点。您可以创建一个连接设置列表,然后循环测试并为第一个成功的连接创建连接池,而不是逐个测试每个连接。下面是一个示例代码:

# Define a list of connection settings
connection_settings <- list(
  list(
    name = "local",
    drv = RPostgres::Postgres(),
    dbname = Sys.getenv("USERDBNAME"),
    user = Sys.getenv("USERUSERNAME"),
    password = Sys.getenv("USERPASSNAME"),
    host = Sys.getenv("LOCHOSTNAME"),
    port = Sys.getenv("LOCPORTNAME")
  ),
  list(
    name = "docker",
    drv = RPostgres::Postgres(),
    dbname = Sys.getenv("USERDBNAME"),
    user = Sys.getenv("USERUSERNAME"),
    password = Sys.getenv("USERPASSNAME"),
    host = Sys.getenv("DOCKHOSTNAME"),
    port = Sys.getenv("DOCKPORTNAME")
  ),
  list(
    name = "fake",
    drv = RPostgres::Postgres(),
    dbname = "db_name",
    user = "user_name",
    password = "pass_name",
    host = "host_name",
    port = "port_name"
  ),
  list(
    name = "admin",
    drv = RPostgres::Postgres(),
    dbname = Sys.getenv("ADMINDBNAME"),
    user = Sys.getenv("ADMINUSERNAME"),
    password = Sys.getenv("ADMINPASSNAME"),
    host = Sys.getenv("ADMINHOSTNAME"),
    port = Sys.getenv("ADMINPORTNAME")
  )
)

# Loop over the connection settings to find the first successful connection
pool <- NULL
for (setting in connection_settings) {
  conn <- tryCatch(
    dbConnect(setting$drv, dbname = setting$dbname,
              host = setting$host, port = setting$port,
              user = setting$user, password = setting$password),
    error = function(e) e
  )
  if (!inherits(conn, "error")) {
    pool <- dbPool(conn)
    print(paste0("Connected to database using ", setting$name, " settings"))
    break
  }
}

if (is.null(pool)) {
  stop("Failed to connect to the database")
}

在这段代码中,我们定义了一个连接设置列表,每个设置都是一个连接参数列表。然后,我们遍历这些设置,对于每个设置,我们尝试使用参数连接到数据库。如果连接成功,我们将从该连接创建一个池,然后退出循环。如果所有连接都不成功,我们将抛出一个错误。
此代码比原始代码更简洁,因为它使用循环来测试所有连接,而不是逐个测试每个连接。它还允许您通过向connection_settings列表添加新列表来轻松添加新连接设置。

相关问题