【问题标题】:R ODBC DBI error: database does not existR ODBC DBI 错误:数据库不存在
【发布时间】:2021-09-20 05:32:00
【问题描述】:

我正在使用 Mac 并尝试连接到 R Studio 中的远程 Postgres 数据库。

错误

一、报错:Error: nanodbc/nanodbc.cpp:1021: 00000: FATAL: database "db_name" does not exist

采取的步骤

我首先使用自制软件安装了必要的依赖项:

brew install unixodbc

brew install psqlodbc

然后设置我的 .ini 文件以包含以下内容:

odbcinst.ini:

[PostgreSQL Driver]
Driver          = /usr/local/lib/psqlodbcw.so

odbc.ini:

[PostgreSQL]
Driver              = PostgreSQL Driver
Database            = test_db
Servername          = localhost
UserName            = postgres
Password            = password
Port                = 5432

在 R 中,运行以下行来检查我的驱动程序是否安装正确,会产生预期的结果:

> odbc::odbcListDrivers()
               name attribute                       value
1 PostgreSQL Driver    Driver /usr/local/lib/psqlodbcw.so

然后我尝试连接到数据库(实际名称/主机/密码已更改),然后会产生数据库“不存在”的错误。所有参数都是正确的,所以我不确定发生了什么。会不会是我在服务器端设置的某种防火墙/ssh 保护?任何帮助将不胜感激,我只是一个谦虚的生物学家,在这里有点超出我的深度。

> con <- dbConnect(odbc::odbc(),
+                  driver = "PostgreSQL Driver",
+                  database = "db_name",
+                  uid = "db_user",
+                  pwd = "db_pass",
+                  host = "123.456.78.910",
+                  port = 5432)
Error: nanodbc/nanodbc.cpp:1021: 00000: FATAL:  database "db_name" does not exist

【问题讨论】:

  • 我相信您得到 "database doesn't exist" 的事实意味着您正在连接到数据库并且可能正在进行一些身份验证,并且数据库 "db_name"不存在或用户"db_user" 无权查看/读取/确认其存在。
  • ...这意味着如果您可以确认您的hostport 是正确的,那么我建议您与您的DBA 核实。您是否尝试过在 R 之外进行连接,可能是使用 psql 命令行实用程序?
  • @r2evans 方便,我也是 DBA :) 是的,我定期与psql 联系。我正在尝试使用 R 来自动化我通常通过 psql 执行的大量导入,使用相同的凭据。
  • 如果重要的话,我一般不使用/etc/odbc* 文件,我使用config 包并直接指定所有这些细节。为此,我注意到您将不同的数据库名称指定为test_db"db_name",也许这是关键?
  • 生物学家和 DBA? R 是在与 Postgres 相同的服务器上运行还是远程运行?在安装了 R 的同一台机器上,请在命令行中显示一个 psql 以及该数据库、用户、密码、主机、端口,该端口运行 simple query call

标签: r postgresql odbc


【解决方案1】:

首先,您的 pg 数据库似乎在您的 Mac 上是本地的(本地主机,对我来说也是),然后您不必在 R 中指定您的 IP。

如果你输入这个会发生什么?因为您的 db_test / db_name 的 DSN 实际上是 [PostgreSQL] (.odbc.ini)。

library(DBI)
con_odbc_to_db_name <- dbConnect(odbc::odbc(), "PostgreSQL")

或者如果它不起作用,可以使用“db_name”、“db_test”/“test_db”进行相同的测试。但我认为您的问题只是 odbc.ini 中的“PostgreSQL”名称。

关于这个问题的更完整的答案,并做一个记事本。

Mac 上的 PostgreSQL odbc 和 DSN 定义。

对于odbc,有两个文件:

  • odbcinst.ini 在 /usr/local/etc/odbcinst.ini 中指定驱动程序名称(您选择)
  • .odbc.ini 在您的 $HOME (~) 中,第一次创建以指定数据源名称 (odbc DSN)

纳米 /usr/local/etc/odbcinst.ini

您必须在某处正确指明驱动程序名称 ODBC(并在 .odbc.ini 之后使用它)。

有关 Mac 上此设置的完整概述,有一篇关于这些 odbc/obdcinst 的非常好的博文,请参阅 here

您将看到在 odbcinst.ini 文件和 .odbc.ini Driver = ... 中为您的 DSN 指定的驱动程序之间有一致的 [Driver]

# nano  /usr/local/etc/odbcinst.ini
[PostgreSQL Unicode]
Description     = PostgreSQL ODBC driver (Unicode version)
Driver          = psqlodbcw.so
Debug           = 0
CommLog         = 1
UsageCount      = 1

捕获:

纳米~/.odbc.ini

使用 DBI/odbc 包,您可以在 .odbc.ini 中为每个数据库传递连接参数,例如:

请注意,您必须将您的数据库名称放在每个定义开头的 [...](ODBC 数据源名称)中。

# .odbc.ini contains:
[db_name]
Driver      = PostgreSQL Unicode
ServerName  = localhost
Port        = 5432
Database    = db_name
Username    = usr
Password    = pwd
Protocol    = 13.0.3
Debug       = 1

[db_test]
Driver      = PostgreSQL Unicode
ServerName  = localhost
Port        = 5432
Database    = db_test
Username    = usr
Password    = pwd
Protocol    = 13.0.3
Debug       = 1

在 RStudio 中测试连接

然后您的数据库将像这样出现在 Rstudio 连接窗格中,对我来说,我的数据库在这里是“pmsi”而不是“db_name”。

之后,要在 R 中连接,就更简单了:您只需在此窗口中单击 db_name 行,或者更准确地说,输入以下内容:

library(DBI)
con_odbc_to_db_name <- dbConnect(odbc::odbc(), "db_name")

关于 RPostgres 包

但是我个人发现使用odbc/DBI dbWriteTable 在pg 中编写大表(多行,多列)有点慢。为此,我使用 RPostgres 包,它使用 \COPY 来“批量”插入原始数据:

con_to_db_name <- RPostgres::dbConnect(RPostgres::Postgres(), "db_name")
# change default schema after that if neeeded
DBI::dbSendQuery(cidd2, "SET search_path = db_preferred_schema, public;")

然后使用来自RPosgres的好的dbWriteTable

RPostgres::dbWriteTable(con_to_db_name,  "db_table_a", table_a, append = TRUE)

【讨论】:

  • 您好,感谢您的详尽回答。不 - 这不是 localhost,它是远程 DigitalOcean 服务器。在开发其他用户可能使用的 Shiny 应用程序时,我想避免将凭据放入 .ini 文件中。至于dbConnect(odbc::odbc(), "PostgreSQL") - 结果:Error: nanodbc/nanodbc.cpp:1021: 00000: FATAL: role "postgres" does not exist
  • 那么它似乎工作了,看来你必须设置正确的用户才能连接到你的数据库或查看stackoverflow.com/questions/15301826/…
猜你喜欢
  • 2019-06-17
  • 2017-12-13
  • 1970-01-01
  • 2019-06-23
  • 2012-09-17
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多