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