【发布时间】:2021-12-14 12:58:31
【问题描述】:
我查看了许多答案并尝试了各种方法来查询我在 Cosmos DB 中拥有的嵌套对象。该数据库包含大量不同类型的 json 类型对象。我已经能够成功查询列表中第一个对象的子对象,但不能查询后续对象。
对象本身如下所示:
{
"id": "d44c1ff6-d5b0-41b0-b84c-2a6c20f99ada",
"deviceUID": "10203040501020304051-8",
"time": "2021-10-27T12:49:53.1174041Z",
"connectorId": 1,
"meterValues": {
"eairo": 1013363236,
"cio": 4
},
"hash": "8ADAED5BBF663AAFE93644CA071573906CC409F70231105F10C5CEE5AE8FC341"
}
而我的连接和查询如下:
cnxn: pyodbc.Connection = pyodbc.connect(
"""DRIVER={CData ODBC Driver for Cosmos DB};
AccountEndpoint=x;
AccountKey=y;""")
df = pd.read_sql_query("SELECT m.id, m.deviceUID, m.time, m.meterValues.eairo FROM metering m WHERE m.deviceUID <> null", cnxn)
事实证明,SELECT 的 m.meterValues.eairo 部分存在问题。报错如下:
pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT m.id, m.deviceUID, m.time, m.meterValues.eairo FROM metering m WHERE m.deviceUID <> null': ('HY000', "[HY000] No table found with the alias 'meterValues'. (-1) (SQLExecDirectW)")
知道我哪里可能出错了吗?
【问题讨论】:
-
你不需要说
FROM metering m- 只需说FROM m。除此之外:您应该尝试使用适用于 Cosmos DB 的本机 Python SDK,而不是 ODBC 库(请记住,Cosmos DB 不是本机关系数据库,它的 SQL 语法是您在关系数据库中找到的一个子集) .我怀疑你会得到更好的结果,因为你目前正试图将 Cosmos DB 强制转换为关系数据库接口。 -
太好了,感谢 David,SDK 完成了这项工作。
标签: python azure azure-cosmosdb pyodbc azure-cosmosdb-sqlapi