芹菜sqlalchemy在每个查询上打开一个不同的会话(而不是关闭它)?

时间:2014-12-02 20:22:22

标签: python flask sqlalchemy celery

全部。我用Flask App设置了芹菜,我有一个问题芹菜如何管理sqlalchemy会话。假设我这样做我的celery应用程序(使用此snippet):

celery = make_celery(app)

#set up a test task
@celery.task(name='testcelery', ignore_result=True)
def test_celery():
    db_session.execute("""INSERT INTO [dbo].[testconstraint]
                      VALUES (1)
                   """)
    db_session.commit()

现在在Flask App的主view.py中添加一个路径

@app.route('/testcelery', methods=['GET'])
def testcelery():
    tasks.test_celery.apply_async()
    return 'just test'

一切正常,除非我每次点击/ testcelery,它都会启动一个会话(我使用MS SQL SERVER)并且不会关闭/删除它(除非我从命令行使用KeyInterupt celery)。它在Activity Monitor中添加了很多会话。

enter image description here

他们每个人都这样:

enter image description here

我已经测试了在芹菜任务结束时添加db_session.close()db_session.remove(),但仍然无效。任何人都知道可能是什么原因?

编辑:这是database.py

中我的引擎和会话创建
engine = create_engine('connection string')
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()

1 个答案:

答案 0 :(得分:0)

您在哪里创建并保留SQLAlchemy Engine对象?引擎处理连接池 - 如果您每次创建会话时都创建引擎,则可能会有一组引擎,每个引擎都保留在一个会话的“池”中。