Не удается подключить postgreSQL к psycopg2
это первый раз, когда я не могу найти ответ о некоторых технических проблемах Вот мои проблемы:
>> 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"?
- мой postgreSQL работает
- мой listeningport-5432 наверняка
- root@lanston-ноутбук:~# 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 ответов
ваш 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"
)
только это решило мою проблему, сделайте символическую ссылку на /tmp/.С. Список pgsql.5432:
sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432
несколько лет спустя, с помощью EnterpriseDB "графическая" установка на OSX 10.8 и pip установить psycopg2 (после связывания / Library/...dylib нужна это как описано здесь) у меня была такая же проблема.
для меня правильной командой connect была conn = psycopg2.connect('dbname=DBNAME user=postgres password=PWHERE host=/tmp/')
первоначально я намеревался сделать комментарий к Tometzky'ы ответ, но у меня есть много, чтобы сказать здесь... Относительно случая, когда вы не звоните psycopg2.connect
напрямую, но использовать стороннее программное обеспечение.
tl; dr
Set unix_socket_directories
на postgresql.conf
to /var/run/postgresql, /tmp
, и перезапустите PostgreSQL.
интро
я пробовал 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 ' == "postgres" || == "postmaster" {print }')
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 ' == "postgres" || == "postmaster" {print }')
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
решение приходит из скриптов постинсталляции соответствующих пакетов:
$ 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 [ "" -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
опции: