Rac*_*acu 7 python firebase google-cloud-firestore
我正在 python 中通过网络抓取创建文档并将其上传到 Firestore。为此,我将它们添加到字典中,并从 python 中的 for 循环逐个上传它们(理想情况下最好立即上传集合,但这似乎不是一个选择)。我想使用批次,但是每批次有 500 个限制,而我需要执行超过 100,000 次操作。这些操作只是set()操作和几个是否有update()
函数可以知道批处理的当前大小以便我可以重新初始化它?在 python 中使用批处理进行 500 多个操作的最佳方法是什么?
我发现在使用 python 时处理 500 个批次限制的最佳方法是将我想要发送到 Firestore 的所有数据放入“Flat”字典中,这样我就可以处理每个唯一的文档。该字典对每个文档都有以下形式的键:“collection_document_collection_document...”,而该键的值将是一个具有以下内容的字典:
{'action': 'set', 'reference': reference, 'document': {}}
Run Code Online (Sandbox Code Playgroud)
“action”可以是“set”、“update”或“delete”,“reference”键是实际的 Firestore 引用,“document”只是文档。例如,这是位于不同位置的 2 个文档。
{
'user_data_roger':
{'action': 'set', 'reference': db.collection('user_data').document('roger'), 'document': {'name': 'Roger', 'age': 37}},
'user_data_roger_works_april':
{'action': 'update', 'reference': db.collection('user_data').document('roger').collection('works').document('april'), 'document': {'is_valid': True, 'in_progress': True, 'level':5}},
}
Run Code Online (Sandbox Code Playgroud)
处理完我需要的所有数据后,我想将字典拆分为 500 个项目的数组,然后使用批次的“action”键将所有这些项目添加到批次中。
# Convert dictionary to a list
dictionary_list = []
for item in dictionary:
dictionary_list.append(dictionary.get(item))
# Split List in lists containing 500 items per list
list_to_batch = [dictionary_list[item:item+500] for item in range(0, len(dictionary_list), 500)]
# Finally iterate through the 'list_to_batch' add each item to the batch and commit using a for loop
for item in list_to_batch:
batch = db.batch()
for document in item:
if document['action'] == 'set':
batch.set(document['reference'], document['value'])
elif draw['action'] == 'update':
batch.update(document['reference'], document['value'])
else:
batch.delete(document['reference'], document['value'])
# Finally commit the batch
batch.commit()
Run Code Online (Sandbox Code Playgroud)
在我的特殊情况下,在处理完所需的所有数据后,我最终执行了超过 700,000 次操作,因此请注意计费:-D
| 归档时间: |
|
| 查看次数: |
3204 次 |
| 最近记录: |