R ODBC DBI error: database does not exist

R ODBC DBI error: database does not exist

我正在开发 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

然后我尝试连接到数据库(实际 names/host/pw 已更改),然后产生数据库“不存在”的错误。所有参数都是正确的,所以我不确定发生了什么。会不会是我在服务器端设置的某种 firewall/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

首先,您的 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 的非常好的博客 post,请参阅 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 中连接,就更容易了:您只需单击此 window 中的 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)

很久以后对我自己的问题的回答:搁置这个项目几个月后,我又回来了,并尝试使用 RPostgres 包的不同驱动程序方法。具体来说,我没有乱用 odbc 驱动程序和 .ini 文件,而是尝试了 RPostgres::Postgres().

drv <- RPostgres::Postgres()
db <- DBI::dbConnect(drv = drv, 
               user = "user",
               password = "pwd",
               dbname = "dbname",
               host = "123.456.78.910")
DBI::dbGetQuery(db, "select * from my_table")