falsk celery task 数据库查询
在使用celery时,函数中修改数据库,commit后调用celery的task查询刚才添加的数据进行其他操作,总会出现找不到的情况,求解。
调用task部分代码
...
try:
db.session.commit()
except Exception as e:
current_app.logger.error(str(e))
db.session.rollback()
if not ci_existed: # only add
self.delete(ci.ci_id)
return abort(500, "add CI error")
his_manager = CIAttributeHistoryManger()
his_manager.add(ci.ci_id, histories)
ci_cache.apply_async([ci.ci_id], queue="async")
# add bj ci
add_ci_bj.apply_async([ci_type.type_name, None, ci.ci_id], queue="async")
return ci.ci_id
celery的task函数
@celery.task(name="xxxxxxx", queue="async")
def add_ci_bj(ci_type, first_id, second_id):
param, status = lib.ci.CIManager().get_relations(first_id, second_id, is_async=True)
...
task中调用的函数
def get_relations(self, first_id, second_id, is_async=False):
start = time.clock()
try:
second = self.get_ci_by_id(second_id, need_children=False)
except Exception as e:
return None, "get ci by id error: first %s, second %s, e %s, is_async:%s" % \
(first_id, second_id, e, is_async)
...
get_relation
中的exception老是被触发,也就是查不到second_id
对应的数据,有遇到过的么???求解
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这个问题确实是比较坑,养成好习惯,使用前先
db.session.Close()
,万一别人没Close呢!!!flask-sqlalchemy
会默认创建一个连接池,里面存放着一定数量的可用连接,并且flask-sqlalchemy
会维护当前连接的状态。db.session.Close()
不是断开连接,而是将连接放回连接池,再次调用时会重新获取到新的最新状态的可用连接。在
server-A
调用db.session..
时,假设获取到的连接为connection-A
,通过该连接对数据库进行commit
操作后,flask-sqlalchemy
会记住当前连接状态,所以再次调用db.session.query...
(仍然使用的是connection-A
)查询刚插入的数据没有任何问题。而
server-B
运行时已经获得connection-B
,当没有调用db.session.Close()
就直接调用db.session.query.
时,连接状态并没有更新,从而取不到server-A
新插入的数据。