gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:24:21 25 4
gpt4 key购买 nike

我在我的应用程序中使用了 flask-sqlalchemy。数据库是 postgresql 9.3。我有简单的数据库初始化、模型和 View :

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'

一切正常。但是当数据库服务器重新启动时(sudo service postgresql restart),在对 /users/ 的第一次请求中,我得到了 sqlalchemy.exc.OperationalError:

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

有没有办法在 View 中更新连接,或者以另一种方式设置 flask-sqlalchemy 以自动更新连接?

更新。

我最终使用了清晰的 SQLAlchemy,为每个 View 声明了引擎、元数据和 db_session,我非常需要它。

这不是问题的解决方案,只是一个“hack”。

所以问题是悬而未决的。我敢肯定,找到解决方案会很好 :)

最佳答案

SQLAlchemy documentation解释默认行为是乐观地处理断开连接。您是否尝试了另一个请求 - 连接应该已经重新建立?我刚刚使用 Flask/Postgres/Windows 项目对此进行了测试,它可以正常工作。

在使用 ORM session 的典型 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数据库重启后 enter image description here

Ubuntu 14.04(Postgres 9.4、Flask 0.10.1、SQLAlchemy 1.0.8、Flask-SQLAlchemy 2.0 和 psycopg 2.5.5)

在第一次数据库请求时 enter image description here数据库重启后 enter image description here

关于postgresql - Flask-sqlalchemy 在重新启动数据库服务器后失去连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34828113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com