Невозможно открыть соединение с PostgreSQL из Python3 - PullRequest
2 голосов
/ 14 июля 2011

У меня странная проблема, когда я не могу подключиться к PostgreSQL из установки Python 3.2.Я использую Fedora 15 и установил Python3 и PostgerSQL9 из репозиториев Fedora, используя yum.У кого-нибудь есть идеи, почему я вижу эту проблему и как ее исправить?Поиски в 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 строку подключения вместо ключевых слов, как к localhost, так и к удаленным хостам.

Ответы [ 3 ]

4 голосов
/ 14 июля 2011

Я думаю, что это, возможно, какая-то ошибка в пакете python3-postgresql, но похоже, что она работает после небольших изменений. Отредактируйте этот файл (вероятно, /usr/lib64 для 64-битных установок):

/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')]
>>>
0 голосов
/ 16 июля 2011

Вы также можете использовать другой модуль - psycopg2 для подключения к postgresql

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

0 голосов
/ 14 июля 2011

Просто предположение, но, вероятно, python передает unicode в postgres и ожидает строки.

...