Cosmos SQL 数据库创建项目

问题描述 投票:0回答:2

我有 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

azure-cosmosdb azure-cosmosdb-sqlapi azure-sdk-python
2个回答
2
投票

考虑到您的

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)

0
投票

使用

container.create_item(body=data)
创建新项目时,
data
字典必须包含
id
键。 为了避免冲突并自动生成随机 ID,请将
enable_automatic_id_generation
参数设置为
True
:

container.create_item(body=data, enable_automatic_id_generation=True)

这允许 Cosmos DB 自动处理 ID 分配。

© www.soinside.com 2019 - 2024. All rights reserved.