首页 > 解决方案 > 使用 Python 脚本将包含 json 对象列表的 .json 文件上传到 Azure CosmosDB 时出现问题

问题描述

我想使用 python 脚本将包含 json 对象列表的 .json 文件上传到 Azure CosmosDB。

我指的是以下链接https://github.com/Azure-Samples/azure-cosmos-db-python-getting-started用于上传包含 JSON 对象列表的 json 文件。此处使用的 Azure cosmos 客户端库仅支持一次发送一个 json 对象,但我想在单个请求中发送一个 json 对象列表。

这是我要发送的 json 格式

    [{
    'id': 'server1',
    'Web Site': 0,
    'Cloud Service': 0,
    'Virtual Machine': 0,
    'message': 'Hello World from Server 1!'
    },
    {
    'id': 'server2',
    'Web Site': 0,
    'Cloud Service': 0,
    'Virtual Machine': 0,
    'message': 'Hello World from Server 1!'
    }]

这是我得到的错误

nayana@nayana-HP-Notebook:~/Azure$ python3 Upload\ to\ azure\ cosmo.py 
Traceback (most recent call last):
  File "Upload to azure cosmo.py", line 52, in <module>
    'message': 'Hello World from Server 2!'
  File "/usr/local/lib/python3.5/dist-packages/azure/cosmos/cosmos_client.py", line 1023, in CreateItem
    collection_id, document, path = self._GetContainerIdWithPathForItem(database_or_Container_link, document, options)
  File "/usr/local/lib/python3.5/dist-packages/azure/cosmos/cosmos_client.py", line 1080, in _GetContainerIdWithPathForItem
    CosmosClient.__ValidateResource(document)
  File "/usr/local/lib/python3.5/dist-packages/azure/cosmos/cosmos_client.py", line 2854, in __ValidateResource
    id = resource.get('id')
AttributeError: 'list' object has no attribute 'get'

我使用pip3 install azure-cosmos 安装了包含 cosmos_client.py的 azure-cosmos 包

标签: jsonazureazure-cosmosdb

解决方案


据我所知,如果您在 python sdk 中使用 CreateItem 方法,则每次只能创建一个文档。一次插入多个文档没有 api 调用。(请参阅此线程:Cosmos DB - 使用 Python 插入多个记录

当然,您可以考虑批量进口。但是目前还不支持python lib 。官方文档中只能找到.net和java lib 。

所以,恐怕你应该加载自己的 json 文件并在循环中执行插入操作。

当然,您可以使用Cosmos db 迁移工具直接将 json 文件加载到 cosmos db 中。

在此处输入图像描述


更新答案:

此反馈链接中提到的 MAC 或 LINUX 无法触及迁移工具。您可以投票支持它以推动此类功能的进展。

官方建议仍然使用 Bulk Executor Library for Java 和 .NET core。如果你必须使用python,你可以参考这个非官方的博客 来获得一些线索。


推荐阅读