我在我的应用程序中使用flask-sqlalchemy. DB是
postgresql 9.3.
我有简单的db,模型和视图初始化:
我有简单的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)
Ubuntu 14.04(Postgres 9.4,sqlAlchemy 1.0.8,Flask-sqlAlchemy 2.0和psycopg 2.5.5)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。