【问题标题】:Unable to open a connection to PostgreSQL from Python3无法从 Python3 打开到 PostgreSQL 的连接
【发布时间】:2011-07-13 20:34:14
【问题描述】:

我遇到了一个奇怪的问题,我无法从 Python 3.2 安装连接到 PostgreSQL。我正在运行 Fedora 15,并使用 yum 从 Fedora 存储库安装了 Python3 和 PostgerSQL9。有没有人知道我为什么会看到这个问题以及如何纠正它? Google 搜索没有出现任何结果。

我已经更改了用户名、密码和数据库,但我的 pg_hba.conf 文件是正确的。

import postgresql
t = postgresql.open(user='validuser', password='secret', database='some_database')

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.2/site-packages/postgresql/__init__.py", line 88, in open
    c.connect()
  File "/usr/lib64/python3.2/site-packages/postgresql/driver/pq3.py", line 2419, in connect
    pq = Connection3(sf, startup, password = password,)
  File "/usr/lib64/python3.2/site-packages/postgresql/protocol/client3.py", line 514, in __init__
    element.Startup(**startup), password
TypeError: keyword arguments must be strings

附带说明一下,如果我尝试使用不同的用户、密码、数据库组合进行连接,并且如果我使用pq://user:password@host/database 连接字符串而不是关键字来连接本地主机和远程主机,则会出现同样的错误。

【问题讨论】:

    标签: python postgresql python-3.x py-postgresql


    【解决方案1】:

    我认为这可能是python3-postgresql 包中的一些错误,但看起来它在稍作改动后就可以工作。编辑此文件(对于 64 位安装,可能是 /usr/lib64):

    /usr/lib/python3.2/site-packages/postgresql/protocol/client3.py
    

    更改(第 514 行):

    element.Startup(**startup), password
    

    到:

    element.Startup(startup), password
    

    之后我进行了简单的连接(我将pg_hba.conf主机方法更改为md5),它看起来没问题:

    [grzegorz@localhost Desktop]$ python3
    Python 3.2 (r32:88445, Feb 21 2011, 21:12:33) 
    [GCC 4.6.0 20110212 (Red Hat 4.6.0-0.7)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import postgresql
    >>> db = postgresql.open("pq://grzegorz:12345@localhost/grzegorz")
    >>> ps = db.prepare("SELECT version()")
    >>> ps()
    [('PostgreSQL 9.0.4 on i386-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.6.0 20110530 (Red Hat 4.6.0-9), 32-bit',)]
    >>> ps = db.prepare("TABLE t")
    >>> ps()
    [(1, 'aaa'), (2, 'bbb'), (3, 'ccc')]
    >>>
    

    【讨论】:

      【解决方案2】:

      只是一个猜测,但 python 可能正在将 unicode 传递给 postgres 并且它需要字符串。

      【讨论】:

      • 感谢您的回复。经过一番研究,我猜这是由于从 Python3.1 升级到 Python3.2 导致的不兼容。我希望找到遇到同样问题并且知道简单解决方法的人。我想重新编译 Python3.1 值得一试。
      • 是的,先生。这在 v1.0.2 中已修复:“Fix Startup() for Python3.2's no non-str() 关键字。”
      【解决方案3】:

      您也可以使用另一个模块 - psycopg2 连接到 postgresql

      http://initd.org/psycopg/download/

      【讨论】:

      • 兼容python3吗?
      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 2015-09-21
      • 2012-11-01
      • 2019-11-02
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多