2016-02-27 92 views
0

我最近开始为我的项目使用Flask + Sqlalchemy,并在离开服务器一天后注意到500错误。我认为这是由于数据库会话超时,但我不确定。我们是否应该为每个请求创建一个新的会话,还是Flask应用程序启动的一个? 我有这个在我app.py烧瓶和sqlalchemy:处理会话

from sqlalchemy import Column, ForeignKey, Integer, String, create_engine, func, cast, Float 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship,scoped_session,sessionmaker,aliased 
engine = createengine(DB_PATH) 
Session = sessionmaker(bind=engine) 
session = Session() 
app = Flask(name_) 

然后在视图中的所有查询的顶部,我做这样的事情:“session.query(表)...” 这是错的,应该我正在为每个端点呼叫进行会话?

回答

0

我建议使用伟大的Flask SQLAlchemy Extension,它处理会话管理和连接池。此外,它可以根据请求处理会话的打开和关闭等。

您可以查看相关SQLAlchemy文档以获取更多详细信息:http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#session-frequently-asked-questions

从文档:

一些web框架包括基础设施,以协助与Web请求的定向会话的寿命的任务。这包括Flask-SQLAlchemy等产品,与Flask Web框架结合使用,以及Zope-SQLAlchemy,通常与Pyramid框架一起使用。 SQLAlchemy建议将这些产品用作可用的。

2

有些情况下,使用Flask-SQLAlchemy Extension可能不合适。例如,如果您要在完全不同的Python模块中管理模型类和数据库连接详细信息以便与Flask之外的软件重用,则不需要/不需要扩展来为您管理这些事情。

假设你有你自己的代码来连接到数据库,并创建通过类似的Session类(也假设engine提供):

Session = scoped_session(sessionmaker(bind=engine)) 

对于需要一个数据库连接的页面,您可以创建一个使用该对象的会话实例:

from flask import g 

def my_page(): 
    session = Session() 
    g.my_db_session = session # save session in the request context 
    ... 

我们需要删除创建的会话。这需要在my_page函数结束之后,但在响应结束之前完成。以上,我们正在为此保存会话在线程本地g对象中。要在正确的时间将其删除,当您创建的应用程序瓶添加此代码:

@app.teardown_appcontext 
    def shutdown_session(exception=None): 
     ''' Enable Flask to automatically remove database sessions at the 
     end of the request or when the application shuts down. 
     Ref: http://flask.pocoo.org/docs/patterns/sqlalchemy/ 
     ''' 
     if hasattr(g, 'my_db_session'): 
      g.my_db_session.remove() 

可能有其他方法可以做到这一点,但这是想法。请注意,SQLAlchemy为您提供连接池。

+0

任何人都可以澄清一件事吗? “Declarative”部分的http://flask.pocoo.org/docs/0.12/patterns/sqlalchemy/中的手册建议直接使用scoped_session返回的对象,而不是每次创建会话实例,也不要求使用g目的。哪种方法是正确的? – AlexVB