python duckdb SQL select result to JSON

sqyvllje  于 6个月前  发布在  Python
关注(0)|答案(2)|浏览(55)

有没有一种方法可以将SELECT查询表的结果直接转换为JSON,而不需要将其写入文件?也许可以使用JSON扩展名duckdb
我也可以使用python客户端,在那里我将结果转换为pandas框架,然后转换为JSON,但我认为应该有一种更直接的方法。
范例:

CREATE TABLE weather (
      city    VARCHAR,
      temp_lo INTEGER, -- minimum temperature on a day
      temp_hi INTEGER, -- maximum temperature on a day
      prcp    REAL,
      date    DATE
  );
INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
INSERT INTO weather VALUES ('Vienna', -5, 35, 10, '2000-01-01');

字符串
一个示例查询是"SELECT city, temp_hi FROM weather;",所需的json如下所示:

{"city": ["San Francisco", "Vienna"], "temp_hi": [50, 35]}


因此,概括一下,我正在寻找直接创建所需JSON的方法,而无需先将结果转换为Python对象。

h9a6wy2h

h9a6wy2h1#

您可以将list aggregate functionSTRUCT一起使用。后者可以使用花括号或struct_pack定义:

SELECT {city: list(city), temp_hi: list(temp_hi)}::JSON AS j FROM weather;
SELECT struct_pack(city := list(city), temp_hi := list(temp_hi))::JSON AS j FROM weather;

字符串
这两种方法都会产生相同的结果:

┌───────────────────────────────────────────────────────┐
│                           j                           │
│                         json                          │
├───────────────────────────────────────────────────────┤
│ {"city":["San Francisco","Vienna"],"temp_hi":[50,35]} │
└───────────────────────────────────────────────────────┘

nsc4cvqm

nsc4cvqm2#

不清楚您在哪里编写查询,以及您期望查询的输出在哪里。

  • 如果您使用的是duckdb CLI工具,您可以在查询任何内容之前设置“mode”,如下所示
v0.9.2 3c695d7ba9
D .mode json
D SELECT city, temp_hi from weather;
[{"city":"San Francisco","temp_hi":50},
{"city":"Vienna","temp_hi":35}]

字符串

  • 如果使用Python客户端API,请检查源代码,它似乎没有像CLI工具那样实现JSON模式。它确实有一个render_mode参数,但只有2个选项。您可以通过编写查询并传递render_mode到show()函数。像con.sql("SELECT city, temp_hi form weather").show(render_mode=1)。你可以只使用fetchall(),它返回结果的元组

无论如何,如果使用Python路线,为什么不使用转换选项呢?

import duckdb

with duckdb.connect("weather.db") as con:
    result = con.sql("SELECT city, temp_hi from weather").df()
weather = result.to_json(orient="records")
print(weather)
> [{"city":"San Francisco","temp_hi":50},{"city":"Vienna","temp_hi":35}]

相关问题