Cosmos SQL db 创建项目

Cosmos SQL db create item

我有 cosmos SQL db python sdk 的问题,我不知道如何解决它。

我有一个数据浏览器,里面有一些数据。我正在使用 python sdk 查询此数据并将输出保存在 json 文件中。到目前为止一切正常。但是我想把它带到下一步,而不是将这个查询结果保存到 json 文件中,我想将这个 query result 直接传递到要存储的 cosmosdb。

这里是主要问题。

我遵循了有关 azure-cosmos 的指南。连接到我的 cosmosdb,我可以使用 python.

进行连接

比起我使用这段代码:

######################################################
##                   COSMOS-DB                      ##
######################################################

url = "<my-url>"
key = "my-key"
client = CosmosClient(url, key)
database_name = "My-Database"
container_name = "Table"
database = client.get_database_client(database_name)
container = database.get_container_client(container_name)
data = json.dumps(str(df))
data_dict = json.loads(data)
print(data_dict)
container.create_item(body=str(data_dict))

df 是一个给我带来问题的数据框,所以我将它解析为字典。

但是当我尝试使用 container.createitem(body=data_dict)

我收到这个错误:

Traceback (most recent call last):
  File "query.py", line 72, in <module>
    container.create_item(body=data_dict)
  File "/Users/user/opt/anaconda3/lib/python3.8/site-packages/azure/core/tracing/decorator.py", line 83, in wrapper_use_tracer
    return func(*args, **kwargs)
  File "/Users/user/opt/anaconda3/lib/python3.8/site-packages/azure/cosmos/container.py", line 511, in create_item
    result = self.client_connection.CreateItem(
  File "/Users/user/opt/anaconda3/lib/python3.8/site-packages/azure/cosmos/_cosmos_client_connection.py", line 1084, in CreateItem
    options = self._AddPartitionKey(database_or_container_link, document, options)
  File "/Users/user/opt/anaconda3/lib/python3.8/site-packages/azure/cosmos/_cosmos_client_connection.py", line 2512, in _AddPartitionKey
    partitionKeyValue = self._ExtractPartitionKey(partitionKeyDefinition, document)
  File "/Users/user/opt/anaconda3/lib/python3.8/site-packages/azure/cosmos/_cosmos_client_connection.py", line 2526, in _ExtractPartitionKey
    return self._retrieve_partition_key(partition_key_parts, document, is_system_key)
  File "/Users/user/opt/anaconda3/lib/python3.8/site-packages/azure/cosmos/_cosmos_client_connection.py", line 2539, in _retrieve_partition_key
    partitionKey = partitionKey.get(part)
AttributeError: 'str' object has no attribute 'get'

此时我完全迷失了,我不明白如何解决这个问题。

更新: 这是我要传递给 cosmos 的数据:

[
  {
    "_timestamp": 1622036400000,
    "name": "User Log Off",
    "message": "message",
    "userID": "userID",
    "Events": "SignOff event",
    "event_count": 1
  },
  {
    "_timestamp": 1622035800000,
    "name": "User Log Off",
    "message": "message",
    "userID": "userID",
    "Events": "SignOff event",
    "event_count": 1
  }
]

这些只是整个数组的2个样本,大约有300个

我修正了之前的错误。

现在我有一个正确的 json 文件正在转储。 它看起来像以前发布的那个。我 运行 container.create_item(item) 但我得到了这个错误:

azure.cosmos.exceptions.CosmosHttpResponseError: (BadRequest) Message: {"Errors":["The input content is invalid because the required properties - 'id; ' - are missing"]}

我相信 cosmos 会自动添加 id

考虑到您的 data_dict 是一个项目数组,您要做的是遍历此数组并分别保存每个项目。

请试试这个代码:

import uuid

url = "<my-url>"
key = "my-key"
client = CosmosClient(url, key)
database_name = "My-Database"
container_name = "Table"
database = client.get_database_client(database_name)
container = database.get_container_client(container_name)
data = json.dumps(str(df))
data_dict = json.loads(data)
print(data_dict)
#Loop through each item in your "data_dict" array.
for item in data_dict:
    #Assign id to the item
    item['id'] = str(uuid.uuid4())
    print(item)
    container.create_item(body=item)