与Flask和SQLAlchemy“客户端连接上的意外EOF”

时间:2013-04-22 07:14:21

标签: python postgresql sqlalchemy flask

我正在使用sqlalchemy的sql抽象层和Flask,遵循此处指示的模式http://flask.pocoo.org/docs/patterns/sqlalchemy/

engine = create_engine('postgresql://' + DB_USER + ':' + DB_PASS + '@' + DB_HOST + ':' + DB_PORT + '/' + DB_NAME)
session = scoped_session(sessionmaker(autocommit=True,
                                  autoflush=True,
                                  bind=engine))

`

metadata = MetaData()

Base = declarative_base(metadata=metadata)
Base.metadata.reflect(engine)

使用scoped_session,在发送响应之前使用teardown_request装饰器删除

@app.teardown_request
def shutdown_db_connexion(exception=None):
    db.session.remove()

除了我在postgres日志中看到很多以下行之外,所有内容似乎都运行良好,这似乎表明db客户端连接存在一些问题。

"unexpected EOF on client connection"
"could not receive data from client: Connection reset by peer"

有关如何调试此问题并修复正在发生的事情的任何想法吗?

3 个答案:

答案 0 :(得分:1)

查看其余的服务器日志,似乎这是OS OOM问题。将此标记为已解决。

答案 1 :(得分:1)

你应该致电

engine.dispose()

答案 2 :(得分:0)

在我的情况下,在程序结束时调用这些代码有助于:

session.close_all()
engine.dispose()

因此完整的sqlalchemy工作流程如下所示:

DBSession = scoped_session(sessionmaker(...))
...
engine = create_engine(...)
DBSession.configure(bind=engine)
...
DBSession().query(...)
...
DBSession().query(...)
...
DBSession.close_all()
engine.dispose()