Python调用Cosmos DB时带WHERE条件的SQL查询失效问题
问题分析与解决方案
你的问题出在手动字符串替换参数的方式以及对Cosmos DB查询规则的误解上,具体问题和修复方法如下:
核心问题点
- Cosmos DB不支持将容器名作为参数化变量(
@container_name这种写法无效),FROM后面的容器名是标识符,必须直接指定或提前拼接,不能通过参数传递。 - 手动替换带引号的
@RowKey会导致类型不匹配:如果数据库里的RowKey是数字类型,替换后变成c.RowKey>'1690000000',字符串和数字比较会报错;如果是字符串类型,参数值传int同样会出问题。 - 你定义的
@PartitionKey、@database_name参数根本没在查询里用到,属于冗余代码,反而增加混乱。
修复后的代码
def run_query(ENDPOINT, KEY, unix_timestamp, token, container_name): client = CosmosClient(url=ENDPOINT, credential=KEY) database = client.get_database_client(database_name) container = database.get_container_client(container_name) # 容器名直接拼接在FROM后,因为不能参数化 general_query = f"SELECT * FROM {container_name} c WHERE c.RowKey > @RowKey" # 只保留实际用到的参数,参数名不要加引号 parameters = [ {"name": "@RowKey", "value": int(unix_timestamp)} # 确保类型和数据库中RowKey一致 ] # 使用Cosmos DB官方的参数化查询,不要手动replace items_tmp = list(container.query_items( query=general_query, parameters=parameters, partition_key=token )) return len(items_tmp) > 0
额外注意事项
- 确认数据库中
RowKey的存储类型:如果是字符串类型,把int(unix_timestamp)改成str(unix_timestamp),查询语句里不用加引号,参数化会自动处理类型匹配。 - 永远用Cosmos DB提供的
parameters参数传递值变量,不要手动字符串替换,避免SQL注入风险和类型错误。
内容的提问来源于stack exchange,提问作者Mattia Gatto
相关产品推荐
相关产品推荐

