Azure CosmosDB 为什么在插入 Azure CosmosDB 时不自动添加"id"字段?



我最近开始得到这个错误,当我调试我的python函数应用程序:(BadRequest) Message: {"Errors":["One of the specified inputs is invalid"]}

功能应用程序非常好地为我的同事,他们没有得到这个错误。当我试图访问azure cosmos数据库时,出现错误。

示例

item = { "firstname": "John", "lastname": "Doe"}
container.upsert_item(item)

问题似乎是插入到数据库中缺少"id"字段。如果我在调用upsert_item(item)之前将这个字段添加到项目中,它会正确工作。

为什么我最初不需要这样做(同事不需要),我改变了什么设置来阻止它自动添加id字段?

我使用visual studio代码,在python编码,安装了azure工具扩展。我试过从磁盘上删除代码并重新克隆它,删除所有扩展并重新安装它们,我甚至完全卸载了visual studio代码。

编辑

增加了容器属性

Container properties {'id': 'person', 'indexingPolicy': {'indexingMode': 'consistent', 'automatic': True, 'includedPaths': [{'path': '/*'}], 'excludedPaths': [{'path': '/"_etag"/?'}]}, 'partitionKey': {'paths': ['/lastname'], 'kind': 'Hash'}, 'uniqueKeyPolicy': {'uniqueKeys': []}, 'conflictResolutionPolicy': {'mode': 'LastWriterWins', 'conflictResolutionPath': '/_ts', 'conflictResolutionProcedure': ''}, 'geospatialConfig': {'type': 'Geography'}, 'analyticalStorageTtl': -1, '_rid': 'O-pDAPQSY5Y=', '_ts': 1654191756, '_self': 'dbs/O-pDAA==/colls/O-pDAPQSY5Y=/', '_etag': '"00003b31-0000-0100-0000-6298f68c0000"', '_docs': 'docs/', '_sprocs': 'sprocs/', '_triggers': 'triggers/', '_udfs': 'udfs/', '_conflicts': 'conflicts/'}

找到了我的问题的答案。我已经将azure cosmos db全局更新到最新版本(4.3.0)(这就是为什么它只影响到我,应该把它放在requirements.txt中),它不允许自动创建ids。

upsert_item(...)函数中有一个单行变化(从4.2.0到4.3.0),当您查看代码墙时很难发现(措辞非常相似)。

Azure-Cosmos-4.3.0 github链接到行

这一行是硬编码的。我不明白为什么他们决定阻止用户自动生成ids。

如果人们还在寻找这个:您现在可以将enable_automatic_id_generation标志添加到create_item方法中。

的例子:

result = container.create_item(
{
"data": "hello world",
},
enable_automatic_id_generation=True,
)