Python中使用async/await删除Firestore集合的报错问题咨询
问题原因
你遇到的报错是因为AsyncCollectionReference调用stream()方法返回的是异步生成器,无法使用普通同步for循环遍历,同时异步环境下的delete()方法也需要用await关键字执行,原同步逻辑的递归调用也要适配异步规则。
可行修复方案
Async/Await实现批量删除的思路完全没有问题,只需将原同步代码全量适配异步语法即可,参考实现如下:
async def delete_collection(col_ref, batch_size): docs = col_ref.limit(batch_size).stream() deleted = 0 async for doc in docs: print(f'Deleting doc {doc.id} => {doc.to_dict()}') await doc.reference.delete() deleted = deleted + 1 if deleted >= batch_size: return await delete_collection(col_ref, batch_size)
额外优化建议
如果要提升删除效率,可以配合异步批量写入AsyncWriteBatch减少IO请求次数,优化后的实现:
from google.cloud.firestore import AsyncWriteBatch async def delete_collection_batch(col_ref, batch_size): deleted = 0 while True: docs = [doc async for doc in col_ref.limit(batch_size).stream()] if not docs: break batch = AsyncWriteBatch(col_ref._client) for doc in docs: batch.delete(doc.reference) await batch.commit() deleted += len(docs) return deleted
注意:Firestore单次批量操作最多支持500条写入/删除请求,所以设置
batch_size时不要超过500的上限。
内容的提问来源于stack exchange,提问作者Keisuke Nagakawa 永川 圭介
相关产品推荐
相关产品推荐

