You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Cosmos MongoDB迁移异步SQL查询报错:Sql api不支持该账户

问题原因与解决方案

你遇到的错误核心是:你的Azure Cosmos DB账户是MongoDB API类型,但你使用了SQL API专属的cosmos.aio.CosmosClient执行SQL查询,不同API类型的SDK与查询语法不兼容,因此触发报错。

两种可行的解决方式:

方式一:用MongoDB异步驱动适配MongoDB API账户

既然是从MongoDB迁移过来,推荐直接使用MongoDB生态的异步驱动(比如Motor),语法和原MongoDB代码几乎一致,改动成本最低:

  1. 安装依赖
pip install motor
  1. 异步查询示例代码
import asyncio
import motor.motor_asyncio
import json

async def exampleAsync():
    # 替换为你的Cosmos DB MongoDB API连接字符串
    client = motor.motor_asyncio.AsyncIOMotorClient("mongodb://<账户名>:<密码>@<账户名>.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@<账户名>@")
    db = client["你的数据库名"]
    collection = db["你的容器名"]

    # 使用MongoDB原生查询语法,和你原来的MongoDB代码逻辑一致
    item = await collection.find_one({"id": "myid"})
    print(json.dumps(item, indent=True))

asyncio.run(exampleAsync())

方式二:切换为SQL API账户并修正查询语句

如果业务确实需要使用Cosmos SQL查询语法,需要:

  • 删除现有MongoDB API账户,重新创建SQL API类型的Cosmos DB账户
  • 保留原cosmos.aio.CosmosClient代码,但修正查询语句的变量传递问题(原查询中myid是变量,需用参数化查询避免注入):
async for item in container.query_items(
    query='SELECT * FROM mycollection m WHERE m.id = @myid',
    parameters=[{'name': '@myid', 'value': '实际ID值'}],
    enable_cross_partition_query=True,
):
    print(json.dumps(item, indent=True))

关键提醒

Azure Cosmos DB是多API兼容服务,不同API类型的账户对应不同的SDK与查询规则:

  • MongoDB API:使用MongoDB驱动(PyMongo/Motor),编写MongoDB原生查询语句
  • SQL API:使用azure-cosmos SDK,编写Cosmos SQL查询语句
    两者不能交叉混用,这是你触发错误的根本原因。

内容的提问来源于stack exchange,提问作者Carabes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:52:15