Не могу соединить postgreSQL с psycopg2 - PullRequest
33 голосов
/ 31 марта 2011

Я впервые не могу найти ответ о некоторых технических проблемах Вот мои проблемы:

>> conn=psycopg2.connect(database="mydb", user="postgres", password="123",port=5432)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
psycopg2.OperationalError: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
  1. Мой postgreSQL работает
  2. Мой порт прослушивания 5432Обязательно
  3. root @ lanston-laptop: ~ # psql -l Пароль:
                                       List of databases
         Name      |  Owner   | Encoding | Collation  |   Ctype    |   Access privileges 
    ---------------+----------+----------+------------+------------+-----------------------
     checkdatabase | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
     mydb          | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
     postgres      | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
     template0     | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
                   |          |          |            |            | postgres=CTc/postgres
     template1     | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
                   |          |          |            |            | postgres=CTc/postgres

Большое спасибо!

Ответы [ 5 ]

54 голосов
/ 31 марта 2011

Ваш libpq, используемый psycopg2, ожидает, что сокет Postgres будет в /var/run/postgresql/, но когда вы устанавливаете Postgres из исходного кода, он по умолчанию находится в /tmp/.

Проверьте, существует ли файл /tmp/.s.PGSQL.5432 вместо /var/run/postgresql/.s.PGSQL.5432. Попробуйте:

conn=psycopg2.connect(
  database="mydb",
  user="postgres",
  host="/tmp/",
  password="123"
)
7 голосов
/ 15 ноября 2011

Попробуйте изменить порт на 5433 вместо 5432

4 голосов
/ 22 сентября 2016

Только это решило мою проблему, сделайте символическую ссылку на /tmp/.s.PGSQL.5432:

sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432

Спасибо, Суххит Сингх Сехра - s-postgresql-server-is-running

3 голосов
/ 16 января 2014

несколько лет спустя, используя EnterpriseDB 'графическую' установку на OSX 10.8 и pip-установку psycopg2 (после связывания /Library/...dylib's , как описано здесь ) У меня была такая же проблема.

для меня правильная команда подключения была conn = psycopg2.connect('dbname=DBNAME user=postgres password=PWHERE host=/tmp/')

1 голос
/ 07 февраля 2018

Изначально я намеревался сделать это комментарием к Tometzky ответу, но у меня есть, что сказать здесь ... Что касается случая, когда вы не звоните psycopg2.connect напрямую,но используйте стороннее программное обеспечение.

tl; dr

Установите unix_socket_directories в postgresql.conf на /var/run/postgresql, /tmp и перезапустите PostgreSQL.

intro

Я попробовал PostgreSQL 9.2 (CentOS 7) и 9.5 (Ubuntu Xenial) из репозиториев, PostgreSQL 9.3, 9.4, 9.5, 9.6, 10 в CentOS 7 из PostgreSQL репо , PostgreSQL 9.6, 10 в Ubuntu Xenialиз Репозиторий PostgreSQL .Среди них только 9.3 слушает только /tmp:

$ systemctl stop postgresql-9.4 && systemctl start postgresql-9.3
$ lsof -aUp $(ps --ppid 1 -o pid= -o comm= | awk '$2 == "postgres" || $2 == "postmaster" {print $1}')
COMMAND    PID     USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
postgres 25455 postgres    4u  unix 0xffff9acb23bc5000      0t0 6813995 /tmp/.s.PGSQL.5432

$ systemctl stop postgresql-9.3 && systemctl start postgresql-9.4
$ lsof -aUp $(ps --ppid 1 -o pid= -o comm= | awk '$2 == "postgres" || $2 == "postmaster" {print $1}')
COMMAND    PID     USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
postgres 26663 postgres    4u  unix 0xffff9ac8c5474c00      0t0 7086508 /var/run/postgresql/.s.PGSQL.5432
postgres 26663 postgres    5u  unix 0xffff9ac8c5477c00      0t0 7086510 /tmp/.s.PGSQL.5432

python-psycopg2

Это не имеет большого значения для psql, просто вопрос запуска соответствующего двоичного файла.Но если, например, у вас установлен python-psycopg2 из репозитория CentOS base или update.Он динамически связывается с libpq, который предоставляет ОС.С установленными 9.3 и 9.4 ОС предоставляет версию 9.4:

$ alternatives --display pgsql-ld-conf
pgsql-ld-conf - status is auto.
 link currently points to /usr/pgsql-10/share/postgresql-9.4-libs.conf
/usr/pgsql-9.3/share/postgresql-9.3-libs.conf - priority 930
/usr/pgsql-9.4/share/postgresql-9.4-libs.conf - priority 940
Current `best' version is /usr/pgsql-9.4/share/postgresql-9.4-libs.conf.

$ ls -l /etc/ld.so.conf.d
lrwxrwxrwx 1 root root 31 Feb  7 02:25 postgresql-pgdg-libs.conf -> /etc/alternatives/pgsql-ld-conf

$ ls -l /etc/alternatives/pgsql-ld-conf
lrwxrwxrwx 1 root root 43 Feb  7 02:25 /etc/alternatives/pgsql-ld-conf -> /usr/pgsql-9.4/share/postgresql-9.4-libs.conf

$ cat /usr/pgsql-9.4/share/postgresql-9.4-libs.conf
/usr/pgsql-9.4/lib/

Но libpq, поставляемый с PostgreSQL 9.4, ищет сокет в /var/run/postgresql, а не 9.3:

$ strings /usr/pgsql-9.3/lib/libpq.so.5 | egrep '/(tmp|var)'
/tmp

$ strings /usr/pgsql-9.4/lib/libpq.so.5 | egrep '/(tmp|var)'
/var/run/postgresql

Решение исходит из сценариев postinstall соответствующих пакетов:

$ yum reinstall --downloadonly postgresql94-libs
$ rpm -qp /var/cache/yum/x86_64/7/pgdg94/packages/postgresql94-libs-9.4.15-1PGDG.rhel7.x86_64.rpm --scripts

postinstall scriptlet (using /bin/sh):
/usr/sbin/update-alternatives --install /etc/ld.so.conf.d/postgresql-pgdg-libs.conf   pgsql-ld-conf        /usr/pgsql-9.4/share/postgresql-9.4-libs.conf 940
/sbin/ldconfig                                                                                 

# Drop alternatives entries for common binaries and man files                                  
postuninstall scriptlet (using /bin/sh):                                                       
if [ "$1" -eq 0 ]
  then
    /usr/sbin/update-alternatives --remove pgsql-ld-conf /usr/pgsql-9.4/share/postgresql-9.4-libs.conf
    /sbin/ldconfig                                                                             
fi

Временно удалите альтернативу 9.4:

$ alternatives --remove pgsql-ld-conf /usr/pgsql-9.4/share/postgresql-9.4-libs.conf
$ ldconfig

После завершения либо переустановите postgresql94-libs, либо добавьте альтернативу обратно:

$ alternatives --install /etc/ld.so.conf.d/postgresql-pgdg-libs.conf pgsql-ld-conf /usr/pgsql-9.4/share/postgresql-9.4-libs.conf 940
$ ldconfig

pip

Если вы устанавливаете psycopg2 с pip с другой стороны, он по умолчанию устанавливает предварительно скомпилированный пакет, который поставляется с собственным libpq, который выглядитдля сокета в /var/run/postgresql:

$ python3.5 -m venv 1
$ . ./1/bin/activate
(1) $ pip install psycopg2

(1) $ python
>>> import psycopg2
>>>Ctrl-Z
[1]+  Stopped                 python

(1) $ pgrep python
26311

(1) $ grep libpq /proc/26311/maps | head -n 1
7f100b8cb000-7f100b90e000 r-xp 00000000 08:04 112980                     /home/yuri/1/lib/python3.5/site-packages/psycopg2/.libs/libpq-909a53d8.so.5.10

(1) $ strings /home/yuri/1/lib/python3.5/site-packages/psycopg2/.libs/libpq-909a53d8.so.5.10 | egrep '/(tmp|var)'
/var/run
/var/run/postgresql

Решение состоит в том, чтобы попросить pip не устанавливать предварительно скомпилированный пакет и сделать доступной pg_config соответствующей версии PostgreSQL:

$ PATH=/usr/pgsql-9.3/lib:$PATH pip install --no-binary psycopg2 psycopg2

Вы даже можете добавить --no-binary переключатель к requirements.txt:

psycopg2==2.7.3.2 --no-binary psycopg2

unix_socket_directories

Хотя проще всего использовать unix_socket_directories опция :

...