SQLAlchemy - 对所有查询元素运行方法

时间:2016-08-31 02:14:28

标签: python sqlalchemy

我有这样的 SQLAlchemy db.Model

def Action(db.Model):
    __tablename__ = 'actions'
    id = db.Column(db.Integer, primary_key=True)
    status  = db.Column(db.String(32), index=True)
    def __init__(self, status):
        self.status = status

    def update(self):
        # Code to update status (External query to API)
        ...
        db.sesssion.commit()

现在我有一个类似的查询:

query = db.session.query(Action)

我想对此查询的所有元素执行update方法。

以下效率非常低,因为每次调用update需要2/3秒。

for a in query.all():
    a.update()

如何对我的查询中的所有元素并行运行update

1 个答案:

答案 0 :(得分:0)

我最终改变了我做事的方式,并在Action模型周围放置了一个REST API。通过将PUT发送到/api/action/{id}端点来完成更新。

我的API客户端可以是异步的,以便并行执行请求。现在REST API本身是多处理的,并分布在多个实例上,SQLAlchemy确保与数据库的连接是并发的。

客户端使用情况如下:

import MyApiClient
client = MyAPIClient('localhost:5001')
actions = client.get_actions()
ids = [a['id'] for a in actions]
for id in ids:
    client.update_action(id, status='RUNNING', async=True)