首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyodbc + PostgreSQL ODBC:连接字符串工作,DSN不工作

pyodbc + PostgreSQL ODBC:连接字符串工作,DSN不工作
EN

Stack Overflow用户
提问于 2021-02-19 21:55:55
回答 1查看 1.7K关注 0票数 1

我正在尝试连接到为Django应用程序构建的Postgres。我可以在windows中很好地连接,但是当我们将它移到Linux服务器上进行生产时,它就停止工作了。我追踪到的是pyodbc不起作用。因此,在另一个脚本中,我一直试图在没有运气的情况下建立一个连接。我很确定Linux服务器正在运行Redhat (yum是安装程序,但我可以再次检查它是否重要)

下面是我尝试过的一些事情:安装unixODBC-devel

将DSN添加到用户sourcename /home/localUsername/.odbc.ini文件,如下所示:

代码语言:javascript
复制
[DSNName]
Description=Postgres Connection to Database
Driver=/usr/pgsql-10/lib/psqlodbc.so
Server=servername
Database=dbname
PWD=pass
UID=username

运行odbcinst -q -d返回: PostgreSQL

我尝试过的python脚本(虽然目前使用解释器)

代码语言:javascript
复制
con = odbc.connect("DSN=DSNName")
con = odbc.connect("Driver={PostgreSQL};Uid=username;Pwd=pass; Server=servername;Port=5432)
con = odbc.connect("Driver={PostgreSQL Unicode(x64)};Uid=username;Pwd=pass; Server=servername;Port=5432)

根据我尝试的驱动程序,我得到了三个错误中的一个:对于使用Unicode(x32)的驱动程序,我得到:

代码语言:javascript
复制
pyodbc.Error ('01000', "[01000] [unixODBC][Driver Manager]can't open lib 'PostgreSQL Unicode(x32)' : file not found ...

我认为这意味着这个驱动程序没有安装,这是很好的。

对于DSN方法,我得到:

代码语言:javascript
复制
pyodbc.OperationalError: ('08001', '[08001] FATAL: role:"localUsername" does not exists\n (101) (SQLDriverConnect)')

第二个错误似乎让我认为(可能是错误的)它试图使用我的localUsername对Postgres进行身份验证,而此时我想使用为主机设置的特殊管理用户名。

对于第三个选项(PostgreSQL):

代码语言:javascript
复制
pyodbc.OperationalError 08001 FATAL: database "dbname" does not exist

我不明白为什么会这样?我的第一个想法是Linux希望使用不同的端口进行连接。在windows环境下,我可以使用5432端口,并且工作正常。因此,假设其余的工作正常,我不知道如何让它找到DB。

如果你需要更多的细节,让我知道,我会尝试添加它们。

编辑:在一个服务器上有python (和Django)。DB在另一台。

尝试运行psql -h OSServername -U 'username‘,并使用相同的:角色错误/DB未找到错误。我觉得我在OSServername之后一定需要一些东西,比如'OsServername/pgAdminServer‘,但这行不通。

通过右键单击pgAdmin内部的一个db服务器名称并选择属性,可以找到DB 'username‘。pgAdmin中的服务器名称是否不同,是否需要将pgAdmin服务器名称作为连接字符串的一部分使用?

如注释所示,从psql -h命令开始似乎是一个很好的起点,因为它消除了python的复杂性。一旦我能使该命令正常工作,我可能能够修复其余的命令。当我的Linux服务器名(主机名)是'LinuxName',pgAdmin服务器是'pgAdminServer',实际DB有一个名称'dbName',而pgAdmin用户名是' username‘时,我应该输入什么?'dbName‘有一个所有者' owner’,它不同于pgServer的用户名,也不同于我在其中签名的Linux用户名。我还验证了“pgAdminServer”显示端口5432,所以这不应该是问题所在。

编辑2:我让pyodbc.connect('Driver={PostgreSQL};Server=servNm;Uid=uid;pwd=pwd;Database=db')开始工作了。现在只需要DSN方法的最后一步。您的dump_dsn在我的dsn文件(本地主目录中的.odbc.ini)中找到了一个错误。所以这很有帮助。还是找不到数据库。/etc/odbcinst.ini中的文件列出了以下驱动程序,我已经在我的DSN文件中尝试过这三个驱动程序:

代码语言:javascript
复制
/usr/pgsql-10/lib/psqlodbc.so
/usr/pgsql-10/lib/psqlodbca.so
/usr/pgsql-10/lib/psqlodbcw.so

以下是我在home/user/ .odbc.ini中的.odbc.ini文件中的信息:变量: servNm、uid、db和pwd与我现在正在工作的pyodbc.connect()字符串中的变量完全匹配。

代码语言:javascript
复制
[DSNName]
Description=Postgres Connection to Database
Driver=/usr/pgsql-10/lib/psqlodbc.so
Server=servNm
CommLog=0
Debug=0
Fetch=100
UniqueIndex=1
UseDeclareFetch=0
Database=db
UID=uid
Username=uid
PWD=pwd
ReadOnly=0
EN

回答 1

Stack Overflow用户

发布于 2022-03-24 16:53:52

我也有同样的问题。我想找几种解决办法,但都没有用。

这个问题比我想象的更容易解决:

1-删除有关postgresodbc的所有包:

代码语言:javascript
复制
$ sudo apt-get remove odbc-postgresql

2-按以下相同顺序安装两个库:

代码语言:javascript
复制
$ apt-get install libcppdb-postgresql0 odbc-postgresql

享受吧!

这样做在这里非常有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66285501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档