首页 > 解决方案 > 带有 contains_eager 的 sqlalchemy 模型实例作为 arg 提交给 ThreadPoolExecutor

问题描述

我有两个模型如下

class User(db.Model, CreatedAtMixin, ModifiedAtMixin):
    __tablename__ = "user"

    id = db.Column(db.Integer, primary_key=True)

class Balance(db.Model, ModifiedAtMixin):
     __tablename__ = "billing_balance"

     id = db.Column(db.Integer, primary_key=True)

     user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
     user = db.relationship("User", backref=backref("balance", uselist=False))

我需要选择一些带有用户负载的余额(以最小化数据库查询的数量)并以非阻塞方式异步处理每个余额。

我是这样做的:

def pmap(fn, iterable, max_workers=20):

    def _ensure_arg_is_iterable(arg):

        if type(arg) in (list, tuple):
            return arg

        return (arg,)

    futures = []
    pool = ThreadPoolExecutor(max_workers=max_workers)
    for params in iterable:
        futures.append(pool.submit(fn, *_ensure_arg_is_iterable(params)))
    return futures


def some_func(balance):
    print(balance.user)


def main():
    balances = db.session.query(Balance).outerjoin(
        User, Balance.user_id == User.id
    ).filter(
         # conditions
    ).options(
       contains_eager(Balance.user)
    )

    ready_to_process = []
    for balance in balances:
        some_irrelevant_method(balance)
        # print(balance.user)
        ready_to_process.append(balance)

    pmap(some_func, ready_to_process)

问题是balance.user如print 语句所示,除非我明确None调用in 。因此,如果没有 AttributeError,我就无法调用任何方法或获取in的任何属性。some_func(balance)balance.usermain()balance.usersome_func

任何关于如何解决这个问题的建议或关于它为什么会这样的命中都将不胜感激。

标签: pythonflasksqlalchemypython-multithreading

解决方案


推荐阅读