python - 带有 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.user
main()
balance.user
some_func
任何关于如何解决这个问题的建议或关于它为什么会这样的命中都将不胜感激。