微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – 重新启动数据库服务器后,Flask-sqlalchemy失去连接

我在我的应用程序中使用flask-sqlalchemy. DB是 postgresql 9.3.
我有简单的db,模型和视图初始化:

from config import *
from flask import Flask,request,render_template
from flask.ext.sqlalchemy import sqlAlchemy
app = Flask(__name__)
app.config['sqlALCHEMY_DATABASE_URI'] = 'postgresql://%s:%s@%s/%s' % (DB_USER,DB_PASSWORD,HOST,DB_NAME)
db = sqlAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    login = db.Column(db.String(255),unique=True,index=True,nullable=False)

db.create_all()
db.session.commit()

@app.route('/users/')
def users():
    users = User.query.all()
    return '1'

一切正常.但是当DB服务器重启时(sudo service postgresql restart),首次请求/ users /我获取sqlalchemy.exc.OperationalError:

OperationalError: (psycopg2.OperationalError) terminating connection due to administrator command
SSL connection has been closed unexpectedly
 [sql: ....

有没有办法在视图内部更新连接,或者以另一种方式设置flask-sqlalchemy以自动续订连接?

UPDATE.

我最终使用了清晰的sqlAlchemy,为每个视图声明了引擎,元数据和db_session,我非常需要它.

它不是问题的解决方案,只是一个’黑客’.

所以问题是开放的.我相信,为此找到解决方案会很好:)

解决方法

sqlAlchemy documentation解释了认行为是乐观地处理断开连接.您是否尝试过其他请求 – 连接应该重新建立?我刚用Flask / Postgres / Windows项目对它进行了测试,它确实有效.

在使用ORM会话的典型Web应用程序中,上述条件对应于单个请求失败并出现500错误,然后Web应用程序正常继续超出该错误.因此,该方法是“乐观的”,因为不会预期频繁的数据库重启.

如果要在连接尝试之前检查连接状态,则需要编写以悲观方式处理断开连接的代码.以下示例代码在文档中提供:

from sqlalchemy import exc
from sqlalchemy import event
from sqlalchemy.pool import Pool

@event.listens_for(Pool,"checkout")
def ping_connection(dbapi_connection,connection_record,connection_proxy):
    cursor = dbapi_connection.cursor()
    try:
        cursor.execute("SELECT 1")
    except:
        # optional - dispose the whole pool
        # instead of invalidating one at a time
        # connection_proxy._pool.dispose()

        # raise disconnectionError - pool will try
        # connecting again up to three times before raising.
        raise exc.disconnectionError()
    cursor.close()

以下是PyCharm调试器中捕获的事件的一些屏幕截图:

Windows 7(Postgres 9.4,Flask 0.10.1,sqlAlchemy 1.0.11,Flask-sqlAlchemy 2.1和psycopg 2.6.1)

在第一个数据库请求

enter image description here


db重启后

enter image description here

Ubuntu 14.04(Postgres 9.4,sqlAlchemy 1.0.8,Flask-sqlAlchemy 2.0和psycopg 2.5.5)

在第一个数据库请求

enter image description here


db restart

enter image description here

之后

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐