falsk celery task 数据库查询

发布于 2022-09-04 03:49:51 字数 1444 浏览 24 评论 0

在使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

彼岸花似海 2022-09-11 03:49:51

这个问题确实是比较坑,养成好习惯,使用前先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新插入的数据。

之前没有在多服务器使用过,所以没遇到,不Close也没什么问题。还有些东西也还没完全搞明白,得看flask-sqlalchemy的源码,为什么不同的状态获取到的数据不同?为什么不在commit之后主动刷新所有连接呢?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文