Cosmos SQL db 创建项

问题描述

我有一个关于 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,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'

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

更新: 这是我试图传递给宇宙的数据:

[
  {
    "_timestamp": 1622036400000,"name": "User Log Off","message": "message","userID": "userID","Events": "SignOff event","event_count": 1
  },{
    "_timestamp": 1622035800000,"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)