Mar*_*ick 0 python postgresql psycopg2 flask-sqlalchemy docker
我正在尝试连接两个 docker 容器,一个是 posgresql,另一个是 python Flask 应用程序。两者都正确链接,python 应用程序中的所有连接变量都直接取自 postgres 容器中通过链接公开的变量,并且与检查 postgresql 容器时发现的变量相同。当我将 psql 与连接字符串中的确切参数一起使用时,即:
psql -p 5432 -h 172.17.0.2 -d mydb -U user
Run Code Online (Sandbox Code Playgroud)
连接到 postgres 容器中的数据库是成功的,所以我知道 postgres 正在通过指定的端口等正确通信。但是,当我尝试通过具有相同连接变量的烧瓶连接到数据库时,我收到此错误:
回溯(最近一次调用):文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 1122 行,在 _do_get 中 return self._pool.get(wait, self._timeout)文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/util/queue.py”,第 145 行,在 get raise Empty sqlalchemy.util.queue.Empty
在处理上述异常的过程中,又发生了一个异常:
回溯(最近一次调用):文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第 2138 行,在 _wrap_pool_connect return fn() 文件“/usr/local/ lib/python3.6/site-packages/sqlalchemy/pool.py", line 328, in unique_connection return _ConnectionFairy._checkout(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py" py”,第 766 行,在 _checkout 仙女 = _ConnectionRecord.checkout(pool) 文件“/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 行,在出口 compat.reraise(exc_type, exc_value, exc_tb) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py”,第 187 行,在重新提高值文件“/usr/local/ lib/python3.6/site-packages/sqlalchemy/pool.py”,第 1135 行,在 _do_get 中返回 self._create_connection() 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py “,第 333 行,在 _create_connection 中返回 _ConnectionRecord(self) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 461 行,在初始化中 self 中。connect(first_connect_check=True) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 651 行,在 __connect connection = pool._invoke_creator(self) 文件“/usr/local/ lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 105, in connect return dialect.connect(*cargs, **cparams) File "/usr/local/lib/python3.6/site -packages/sqlalchemy/engine/default.py”,第 393 行,在连接中返回 self.dbapi.connect(*cargs, **cparams) 文件“/usr/local/lib/python3.6/site-packages/psycopg2/ __init .py", line 164, in connect conn = _connect(dsn, connection_factory=connection_factory, async=async) psycopg2.OperationalError: 无法连接到服务器:连接被拒绝 服务器是否在主机“172.17.0.2”上运行并接受端口 5432 上的 TCP/IP 连接?
上述异常是以下异常的直接原因:
回溯(最近一次调用):文件“./wsgi.py”,第 14 行,在 app = getModule("/var/www", name).app 文件“./wsgi.py”,第 5 行,在 getModule return imp.load_source(module, ("%s/%s.py" % (path, name))) File "/usr/local/lib/python3.6/imp.py", line 172, in load_source module = _load(spec) File "/var/www/backend.py", line 3, in import json, logging, db, os File "/var/www/db.py", line 36, in engine.connect() 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第 2082 行,在连接中返回 self._connection_cls(self, **kwargs) 文件“/usr/local/lib/ python3.6/site-packages/sqlalchemy/engine/base.py", line 90, in init 如果连接不是 None else engine.raw_connection() File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2168, in raw_connection self.pool.unique_connection, _connection)文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第2142行,在_wrap_pool_connect e,方言,自我)文件“/usr/local/lib/python3.6/ site-packages/sqlalchemy/engine/base.py”,第 1456 行,在 _handle_dbapi_exception_noconnection exc_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 行,在 reraise raise value .with_traceback(tb) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py”,第 2138 行,在 _wrap_pool_connect 中返回 fn() 文件“/usr/local/lib/python3. 6/site-packages/sqlalchemy/pool.py", line 328, in unique_connection return _ConnectionFairy._checkout(self) File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 766,在_checkoutfairy = _ConnectionRecord.checkout(pool)文件“/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 行,在6/site-packages/sqlalchemy/engine/base.py”,第 2138 行,在 _wrap_pool_connect 中返回 fn() 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 328 行, 在 unique_connection 返回 _ConnectionFairy._checkout(self) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 766 行,在 _checkout 仙女 = _ConnectionRecord.checkout(pool) 文件“/ usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 516, in checkout rec = pool._do_get() File "/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 行,在6/site-packages/sqlalchemy/engine/base.py”,第 2138 行,在 _wrap_pool_connect 中返回 fn() 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 328 行, 在 unique_connection 返回 _ConnectionFairy._checkout(self) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 766 行,在 _checkout 仙女 = _ConnectionRecord.checkout(pool) 文件“/ usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 516, in checkout rec = pool._do_get() File "/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 行,在在 _wrap_pool_connect 中返回 fn() 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 328 行,在 unique_connection 中返回 _ConnectionFairy._checkout(self) 文件“/usr/local/lib /python3.6/site-packages/sqlalchemy/pool.py”,第 766 行,在 _checkout 仙女 = _ConnectionRecord.checkout(pool) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool. py”,第 516 行,在结帐中 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 行,在在 _wrap_pool_connect 中返回 fn() 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 328 行,在 unique_connection 中返回 _ConnectionFairy._checkout(self) 文件“/usr/local/lib /python3.6/site-packages/sqlalchemy/pool.py”,第 766 行,在 _checkout 仙女 = _ConnectionRecord.checkout(pool) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool. py”,第 516 行,在结帐中 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 行,在_checkout(self) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 766 行,在 _checkout 精灵 = _ConnectionRecord.checkout(pool) 文件“/usr/local/lib/ python3.6/site-packages/sqlalchemy/pool.py", line 516, in 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 行,在_checkout(self) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 766 行,在 _checkout 精灵 = _ConnectionRecord.checkout(pool) 文件“/usr/local/lib/ python3.6/site-packages/sqlalchemy/pool.py", line 516, in 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 行,在6/site-packages/sqlalchemy/pool.py”,第 1138 行,在 _do_get self._dec_overflow() 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py”中,行60,在6/site-packages/sqlalchemy/pool.py”,第 1138 行,在 _do_get self._dec_overflow() 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py”中,行60,在退出 compat.reraise(exc_type, exc_value, exc_tb) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py”,第 187 行,在 reraise 提高值文件“/usr/local /lib/python3.6/site-packages/sqlalchemy/pool.py”,第 1135 行,在 _do_get 中返回 self._create_connection() 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool. py”,第 333 行,在 _create_connection 中返回 _ConnectionRecord(self) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 461 行,在init self 中。connect(first_connect_check=True) 文件“/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py”,第 651 行,在 __connect connection = pool._invoke_creator(self) 文件“/usr/local/ lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 105, in connect return dialect.connect(*cargs, **cparams) File "/usr/local/lib/python3.6/site -packages/sqlalchemy/engine/default.py”,第 393 行,在连接中返回 self.dbapi.connect(*cargs, **cparams) 文件“/usr/local/lib/python3.6/site-packages/psycopg2/ __在里面.py”,第 164 行,在连接 conn = _connect(dsn, connection_factory=connection_factory, async=async) sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) 无法连接到服务器:连接被拒绝 服务器是否在主机“172.17”上运行.0.2" 并在端口 5432 上接受 TCP/IP 连接?
以下是我的flask应用程序中导致异常的代码:
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()
Run Code Online (Sandbox Code Playgroud)
当我记录“引擎”时,我得到了这个:
Engine(postgresql://user:***@172.17.0.2:5432/mydb)
Run Code Online (Sandbox Code Playgroud)
这再次将成功数据库连接中使用的参数与我的主机上的数据库相匹配。
我假设我的 python 代码一定有问题,因为所有帐户都显示 docker 容器正常工作。
任何帮助将不胜感激,谢谢。
所以我的代码实际上没问题,发生的事情是竞争条件,在数据库完全初始化并接受连接之前,python 发送连接请求。