use*_*780 6 postgresql sqlalchemy psycopg2 flask 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'
Run Code Online (Sandbox Code Playgroud)
一切正常.但是当发生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: ....
Run Code Online (Sandbox Code Playgroud)
有没有办法在视图内部更新连接,或者以另一种方式设置flask-sqlalchemy以自动续订连接?
UPDATE.
我最终使用了清晰的SQLAlchemy,为每个视图声明了引擎,元数据和db_session,我非常需要它.
它不是问题的解决方案,只是一个'黑客'.
所以问题是开放的.我相信,为此找到解决方案会很好:)
SQLAlchemy 文档解释了默认行为是乐观地处理断开连接.您是否尝试过其他请求 - 连接应该重新建立?我刚用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()
Run Code Online (Sandbox Code Playgroud)
以下是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,Flask 0.10.1,SQLAlchemy 1.0.8,Flask-SQLAlchemy 2.0和psycopg 2.5.5)
简而言之,您可以在调用函数时SQLAlchemy添加pool_pre_ping=Truekwargcreate_engine来解决此问题。
使用时Flask-SQLAlchemy,您可以使用相同的参数,但您需要将其作为engine_optionskwarg中的字典传递:
app.db = SQLAlchemy(app, engine_options={"pool_pre_ping": True})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2290 次 |
| 最近记录: |