【问题标题】:Can't connect the postgreSQL with psycopg2无法将 postgreSQL 与 psycopg2 连接
【发布时间】:2011-07-26 21:35:01
【问题描述】:

第一次找不到一些技术问题的答案 这是我的问题:

>> 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 密码:
数据库列表 姓名 |所有者 |编码 |整理 |类型 |访问权限 ---------------+----------+----------+------------ +------------+----------- 检查数据库 |后勤 | UTF8 | en_US.utf8 | en_US.utf8 | 数据库 |后勤 | UTF8 | en_US.utf8 | en_US.utf8 | 后勤 |后勤 | UTF8 | en_US.utf8 | en_US.utf8 | 模板0 |后勤 | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres 模板1 |后勤 | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres

非常感谢!

【问题讨论】:

    标签: postgresql psycopg2


    【解决方案1】:

    psycopg2 使用的 libpq 期望 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"
    )
    

    【讨论】:

    • 如果您将 Debian/Ubuntu 打包的 PostgreSQL 安装与手动编译的混合安装,这通常是一个问题。避免这种情况,除非您准备好处理此类问题。
    • 有没有办法让套接字回到 /var/run/postgresql/ ? (我刚刚编辑了一个 django 源文件,让我的项目现在可以再次运行,但这并不是一个很好的解决方案)顺便说一下,我没有从源代码安装......
    • 当我用 Homebrew 替换内置 Postgres 时,我在 OSX 上遇到了这个问题。我必须卸载并重新安装 psycopg2 以使其使用正确的 libpq.dylib,而后者又使用了正确的 unix 套接字路径。
    • 我在从PGDG repository 切换到 PostgreSQL 包后遇到了这个问题。将--no-binary 添加到requirements.txt 并将pg_config 的目录添加到PATH 解决了它。
    【解决方案2】:

    只有这样才能解决我的问题, 创建到 /tmp/.s.PGSQL.5432 的符号链接:

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

    感谢Sukhjit Singh Sehra - s-postgresql-server-is-running

    【讨论】:

    • 同样:host="/tmp/" 没有修复,但它修复了。
    • @Dhanalal_Bhardwaj sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432 ln: 访问 '/var/run/postgresql/ 失败。 s.PGSQL.5432':权限被拒绝
    • @P_M 我不确定为什么即使是 sudo 也会出现这种情况。您可以检查“ln”命令规范和其他与权限相关的答案。 :|
    【解决方案3】:

    我原本打算把它作为对Tometzky的回答的评论,但是,我在这里有很多话要说......关于你不直接打电话给psycopg2.connect,而是使用第三个的情况-派对软件。

    tl;博士

    postgresql.conf中的unix_socket_directories设置为/var/run/postgresql, /tmp,然后重启PostgreSQL。

    简介

    我从发行版存储库尝试了 PostgreSQL 9.2 (CentOS 7) 和 9.5 (Ubuntu Xenial),从 PostgreSQL repo 在 CentOS 7 上尝试了 PostgreSQL 9.3、9.4、9.5、9.6、10,从 PostgreSQL repo 在 Ubuntu Xenial 上尝试了 PostgreSQL 9.6、10 .其中只有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 没什么大不了,只是运行匹配的二进制文件的问题。但是,例如,如果您从 CentOS 的 baseupdate 存储库安装了 python-psycopg2。它动态链接到操作系统提供的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/
    

    但是 PostgreSQL 9.4 附带的 libpq/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 [ "$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

    另一方面,如果您使用pip 安装psycopg2,它默认安装带有自己的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 option

    【讨论】:

      【解决方案4】:

      尝试将端口更改为 5433 而不是 5432

      【讨论】:

      • 这尤其适用于安装了新的 postgres 版本而之前的版本仍在运行的情况。由于 postgres 无法使用端口 5432,它会失败到下一个可用端口,通常是 5433。
      【解决方案5】:

      几年后,在 OSX 10.8 上使用 EnterpriseDB 'graphical' install 并 pip 安装 psycopg2(在链接 /Library/...dylib 的 as described here 之后)我遇到了同样的问题。

      对我来说正确的连接命令是conn = psycopg2.connect('dbname=DBNAME user=postgres password=PWHERE host=/tmp/')

      【讨论】:

        【解决方案6】:

        brew upgrade 之后发生这种情况,我搜索了brew .s.PGSQL.5432

        根据this answer 中的建议,我执行了以下操作:

        postgres -D /usr/local/var/postgres
        

        得到:

        2019-10-29 17:43:30.860 IST [78091] FATAL:  database files are incompatible with server
        2019-10-29 17:43:30.860 IST [78091] DETAIL:  The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 11.5.
        

        我用谷歌搜索了那个致命错误,并按照this answer 中的建议运行:

        brew postgresql-upgrade-database
        

        这为我解决了。

        【讨论】:

          【解决方案7】:

          在我安装 conda 的情况下,必须:sudo ln -s /var/run/postgresql/.s.PGSQL.5432 /tmp/.s.PGSQL.5432

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-28
            • 2017-02-17
            • 2012-10-19
            • 1970-01-01
            • 2020-08-27
            • 2014-03-02
            • 1970-01-01
            相关资源
            最近更新 更多