当前位置: 首页 > 知识库问答 >
问题:

(psycopg2.OperationalError)无法连接到服务器:服务器拒绝连接

尉迟鑫鹏
2023-03-14

我正在尝试连接两个docker容器,一个是posgresql,另一个是python flask应用程序。两者都链接正确,python应用程序中的所有连接变量都直接取自postgres容器中通过链接公开的连接变量,并且与检查postgresql容器时发现的连接变量相同。当我将psql与连接字符串中的精确参数一起使用时,即:

psql -p 5432 -h 172.17.0.2 -d mydb -U user

成功连接到postgres容器中的数据库,因此我知道postgres正在通过指定的端口等正确通信。但是,当我尝试使用相同的连接变量通过flask连接到数据库时,我收到以下错误:

Traceback(最近一次调用最后一次):File"/usr/local/lib/python3.6/site-pack/sqlalChemy/pool.py",第1122行,_do_get返回自己。_pool.get(等待,自己。_timeout)File"/usr/local/lib/python3.6/site-Packy/sqlalChemy/util/queue.py",第145行,在获取加注空sqlalchemy.util.queue.空

在处理上述异常期间,发生了另一个异常:

回溯(最近一次调用):文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第2138行,在_-wrap\u-pool\u-connect-return fn()文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”中,第328行,在unique\u-connection-return\u-ConnectionFairy中_签出(self)文件“/usr/local/lib/python3.6/site packages/sqlalchemy/pool.py”,第766行,在checkout fairy=\u ConnectionRecord中。签出(池)文件“/usr/local/lib/python3.6/site packages/sqlalchemy/pool.py”,第516行,在checkout rec=pool中_do_get()文件“/usr/local/lib/python3.6/site packages/sqlalchemy/pool.py”,第1138行,在do_get self中_dec_overflow()文件“/usr/local/lib/python3.6/site packages/sqlalchemy/util/langhelpers.py”,第60行,退出兼容。在reraise raise value File“/usr/local/lib/python3.6/site packages/sqlalchemy/util/compat.py”中,第187行,在reraise raise value File“/usr/local/lib/python3.6/site packages/sqlalchemy/pool.py”中,第1135行,返回self_创建连接()文件“/usr/local/lib/python3.6/site packages/sqlalchemy/pool.py”,第333行,在init self的第461行中创建连接返回连接记录(self)文件“/usr/local/lib/python3.6/site packages/sqlalchemy/pool.py”。connect(first_connect_check=True)文件“/usr/local/lib/python3.6/site packages/sqlalchemy/pool.py”,第651行,在_connectconnection=pool中_在connect返回方言中调用_creator(self)文件“/usr/local/lib/python3.6/site packages/sqlalchemy/engine/strategies.py”,第105行。connect(*cargs,**cparams)文件“/usr/local/lib/python3.6/site packages/sqlalchemy/engine/default.py”,第393行,在connect返回self中。dbapi。connect(*cargs,**cparams)文件“/usr/local/lib/python3.6/site packages/psycopg2/_init.py”,第164行,在connect conn=_connect(dsn,connection_factory=connection_factory,async=async)psycopg2中。操作错误:无法连接到服务器:连接被拒绝服务器是否在主机“172.17.0.2”上运行并在端口5432上接受TCP/IP连接?

上述异常是以下异常的直接原因:

回溯(最近一次调用):文件“/wsgi.py”,第14行,在app=getModule(“/var/www”,name)中。应用程序文件“/wsgi.py”,第5行,在getModule返回imp.load\u源(模块,(%s/%s.py“%(路径,名称)))文件“/usr/local/lib/python3.6/imp.py”,第172行,在load\u源模块=\u加载(规范)文件“/var/www/backend.py”中,第3行,在导入json、日志、数据库、操作系统文件“/var/www/db.py”中,第36行,在引擎中。connect()文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第2082行,在connect-return-self中_如果连接不是None-else引擎,则在init中的第90行输入connection_cls(self,**kwargs)文件“/usr/local/lib/python3.6/site packages/sqlalchemy/engine/base.py”。raw_connection()文件“/usr/local/lib/python3.6/site packages/sqlalchemy/engine/base.py”,第2168行,在raw_connection self中。水塘唯一连接,连接)文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第2142行,在包池连接e,方言,self)文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”中,第1456行,在(u-handle\u-dbapi\u-exception\u-noconnection exc\u-info文件中“/usr/local/lib/python3。6/site-packages/sqlalchemy/util/compat。py“,第203行,在raise_from_cause reraise(type(exception),exception,tb=exc_tb,cause=cause)文件“/usr/local/lib/python3中。6/site-packages/sqlalchemy/util/compat。py”,第186行,在重新调用提升值时使用_traceback(tb)文件“/usr/local/lib/python3。6/站点包/sqlalchemy/engine/base。py”,第2138行,在_wrap_pool_connect return fn()文件“/usr/local/lib/python3中。6/站点包/sqlalchemy/pool。py”,第328行,在唯一的连接返回ConnectionFairy.checkout(self)文件“/usr/local/lib/python3中。6/站点包/sqlalchemy/pool。py”,第766行,在_checkoutfairy=_ConnectionRecord.checkout(pool)文件“/usr/local/lib/python3中。6/站点包/sqlalchemy/pool。py”,第516行,在checkout rec=pool.\u do\u get()文件“/usr/local/lib/python3中。6/站点包/sqlalchemy/pool。py”,第1138行,在文件“/usr/local/lib/python3”中。6/站点包/sqlalchemy/util/langhelpers。py“,第60行,在exit compat.reraise(exc_类型、exc_值、exc_tb)文件“/usr/local/lib/python3中。6/site-packages/sqlalchemy/util/compat。py”,第187行,在重新调用提升值文件“/usr/local/lib/python3中。6/站点包/sqlalchemy/pool。py“,第1135行,在_do_get return self._create_connection()文件“/usr/local/lib/python3中。6/站点包/sqlalchemy/pool。py”,第333行,在“创建连接返回连接记录(self)”文件/usr/local/lib/python3中。6/站点包/sqlalchemy/pool。py”,第461行,在init self.connect(first_connect_check=True)文件“/usr/local/lib/python3中。6/站点包/sqlalchemy/pool。py”,第651行,在uu connect connection=pool中。调用_creator(self)文件“/usr/local/lib/python3。6/站点包/sqlalchemy/engine/strategies。py”,第105行,在connect返回方言中。connect(*cargs,**cparams)文件“/usr/local/lib/python3。6/站点包/sqlalchemy/engine/default。py”,第393行,在connect返回self.dbapi.connect(*cargs,**cparams)文件“/usr/local/lib/python3中。6/站点包/psycopg2/_init。py”,第164行,在connect conn=_connect(dsn,connect_factory=connection_factory,async=async)sqlalchemy.exc.OperationalError:(psycopg2.OperationalError)无法连接到服务器:连接被拒绝是主机“172.17”上运行的服务器。0.2英寸并在端口5432上接受TCP/IP连接?

下面是我烧瓶应用程序中导致异常的代码:

import os, logging, json
from datetime import datetime
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy import BigInteger, Integer, String, DateTime, Column, Table, ForeignKey, create_engine
from sqlalchemy.dialects.postgresql import JSON
from sqlalchemy.orm import scoped_session, sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base

user = os.environ.get('DB_USER','user')
password = os.environ.get('DB_PASSWORD','password')
address = os.environ.get('DB_ADDR','0.0.0.0')
port = os.environ.get('DB_PORT','')
name = os.environ.get('DB_NAME','')

db_url = "postgresql://%s:%s@%s:%s/%s" % (user, password, address, port, name) 

engine = create_engine(db_url, convert_unicode=True, client_encoding='utf8')

print (engine)

engine.connect()

当我记录“引擎”时,我得到以下信息:

Engine(postgresql://user:***@172.17.0.2:5432/mydb)

它再次匹配从我的主计算机与数据库成功连接时使用的参数。

我假设我的python代码一定有问题,因为docker容器在所有帐户中都正常工作。

任何帮助都将不胜感激,谢谢。

共有1个答案

邵君植
2023-03-14

所以我的代码实际上是正常的,发生的是一种竞争条件,python在数据库完全初始化和接受连接之前发送连接请求。

 类似资料:
  • 每次运行Rails4.0服务器时,都会得到这个输出。 我正在运行小牛OS X10.9,所以我不知道这是不是问题所在。我已经试了我能试的一切,但似乎都没有效果。我已经卸载并安装了postgres和pg gem多次了。 这是我的database.yml文件

  • 问题内容: 我正在尝试在运行12.04的Ubuntu计算机上使用mysql创建远程数据库。 它具有启用了远程登录且没有密码的root用户。我已经启动了服务器。 输出 表演 我已经使用创建了一个名为nwtopology的数据库(如上所述,root还没有密码。) 在也运行Ubuntu 12.04的客户端计算机上,我使用python脚本通过sqlalchemy连接到远程mysql数据库。 create_

  • 问题内容: 我正在尝试使用Flask在Raspberry Pi上运行一个简单的Web服务器。当我运行Flask应用程序时,它说: 在http://127.0.0.1:5000/上运行 但是,当我在笔记本电脑的Chrome中输入此地址时, ERR_CONNECTION_REFUSED 我可以在Raspberry Pi的浏览器上打开127.0.0.1:5000。我需要怎么做才能从另一台计算机连接? 问

  • 因此,我的计划是编写一个dockerfile,使用基本映像,然后在其中复制并运行。 SQL脚本:db0.SQL DockerFile:db0.dockerFile null 完成这些操作后,我可以用一个python_team数据库、一个带有示例表的测试模式和一条记录连接到它。 怎么解决?

  • 我在设置打开班次时遇到问题,并在连接到我的服务器域后收到以下错误: 我不确定这是在告诉我做什么。我尝试按字面意思使用指令,但它无法识别命令。 有什么想法吗?

  • 问题内容: 我不确定如何解决此问题 我不知道为什么在尝试以下操作时会出现此错误: 当我尝试连接到postgres时: 问题答案: 可能是一些问题: PostgreSQL没有运行。用sudo检查 你的PostgresSQl不在端口5432上运行。你可以检查其键入 尝试连接到数据库时出现错误,例如用户名,密码或数据库名。检查它们是否是postgres要求你连接的对象,并且这是你要访问的db_name。