【问题标题】:Formatting the result of an SQL query into JSON将 SQL 查询的结果格式化为 JSON
【发布时间】:2020-07-08 07:11:14
【问题描述】:

我有一个小型数据库,在下面的代码 sn-p 中定义。我想查询它以获取所有信息并通过 Flask API 通过 JSON 文件将其发送到 vue 应用程序。目前我正在使用的查询是

SELECT tbl_room.room, tbl_room.room_id, tbl_device.name, tbl_display.display, tbl_function.function, tbl_device.format
    FROM tbl_device
    INNER JOIN tbl_room ON tbl_room.id = tbl_device.room_id
    INNER JOIN tbl_display ON tbl_display.id = tbl_device.display_id
    INNER JOIN tbl_function ON tbl_function.id = tbl_device.function_id
    ORDER BY tbl_room.room_id;

这给了我这样的输出:

Bedroom (Main)  bedroom_main    bme280/1    gauge   temperature {"min": 0, "max": 50, "dp": 1, "units": "°C"}
Bedroom (Main)  bedroom_main    bme280/1    gauge   humidity    {"min": 0, "max": 100, "dp": 1, "units": "%"}
Bedroom (Main)  bedroom_main    bme280/1    gauge   pressure    {"min": 0, "max": 1100, "dp": 1, "units": "hPa"}
Front Room  front_room  ds18b20/heater  gauge   temperature {"min": 0, "max": 50, "dp": 1, "units": "°C"}

我想把它变成一个 JSON 文件,这样它就被安排为:

[
    { "name": "Office",
      "id": "office",
      "devices": []
    },
    { "name": "Front Room", 
       "id": "front_room",
       "devices": []
    }
  }
]

这可以在单个 sql 查询中完成吗?还是我必须循环查询每个房间?或者将整个数据集转储到一个查询中然后在 pyhton 中处理它是否更有效?这是一个小数据集,但我很想知道哪种方法最有效。

提前谢谢你, 马丁

这是我的表结构:

-- Table: tbl_device
CREATE TABLE tbl_device (
    name        VARCHAR NOT NULL ON CONFLICT ROLLBACK,
    room_id     INTEGER CONSTRAINT fk_room REFERENCES tbl_room (id) 
                        NOT NULL,
    function_id INTEGER CONSTRAINT fk_function REFERENCES tbl_function (id) 
                        NOT NULL ON CONFLICT ROLLBACK,
    display_id  INTEGER CONSTRAINT fk_display REFERENCES tbl_display (id) 
                        NOT NULL ON CONFLICT ROLLBACK,
    format      VARCHAR NOT NULL ON CONFLICT ROLLBACK
                        DEFAULT [default],
    UNIQUE (
        name,
        room_id,
        function_id,
        display_id
    )
    ON CONFLICT ROLLBACK
);


-- Table: tbl_display
CREATE TABLE tbl_display (
    id      INTEGER PRIMARY KEY AUTOINCREMENT,
    display VARCHAR NOT NULL ON CONFLICT ROLLBACK
                    UNIQUE ON CONFLICT ROLLBACK
);


-- Table: tbl_function
CREATE TABLE tbl_function (
    id       INTEGER PRIMARY KEY AUTOINCREMENT,
    function VARCHAR NOT NULL ON CONFLICT ROLLBACK
                     UNIQUE ON CONFLICT ROLLBACK,
    control  BOOLEAN NOT NULL
                     DEFAULT (0) 
);


-- Table: tbl_room
CREATE TABLE tbl_room (
    id      INTEGER PRIMARY KEY AUTOINCREMENT,
    room_id VARCHAR NOT NULL
                    UNIQUE ON CONFLICT ROLLBACK,
    room    VARCHAR NOT NULL ON CONFLICT ROLLBACK
);

【问题讨论】:

  • mysql不支持on conflict子句,所以不能使用mysql。
  • 抱歉,不小心包含了错误的标签

标签: python-3.x sqlite


【解决方案1】:

首先,无法将 MySQL 数据库中的 JSON 响应直接提供给 VueJS 或任何其他应用程序。 VueJS App 是您应用程序的前端。您必须创建一个连接到 MySQL 数据库的后端,从 MYSQL 数据库中获取必要的数据,将它们转换为 JSON 并发送到 Vue App。

要开发后端,您可以使用 PHP、Python、Java、NodeJS 等语言。

如果可以继续使用 PHP,那么获取数据并转换为 JSON 非常容易。

但如果你仍然需要继续使用 Python,你必须使用 Flask 或任何其他 python web 框架来做到这一点。

这里是示例 php 代码

<?php

$dbhost = 'hostname';
$dbuser = 'username';
$dbpass = 'password';
$dbname = 'database';

  $db = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

  if ($db->connect_errno) {
     printf("Failed to connect to database");
     exit();
  }

  $result = $db->query("SELECT * FROM "); // Your SQL query

  $data = array();

  while ( $row = $result->fetch_assoc())  {
    $data[]=$row;
  }


 echo json_encode($data);
 
?>

【讨论】:

  • 是的,我意识到我需要一个后端 - 我应该在问题中提到这一点。我已经运行了一个烧瓶应用程序,它根据前端应用程序的请求运行查询。我只是在寻找查询后端数据的最有效方法。我已经编辑了问题。
  • 请看这个帖子stackoverflow.com/questions/43796423/… 已经解释了一个简单有效的方法,在Flask中将mysql获取的数据转换成json
  • 谢谢,这并没有解决如何以我需要的方式对 json 进行分组。这只会将查询的每一行转换为 json 数组。
【解决方案2】:

如果您的 sqlite 版本是使用 JSON1 extension 编译的,则启用,类似于:

SELECT json_group_array(json_object('name', tbl_room.name,
                                    'id', tbl_room.room_id,
                                    'devices', json_array()))
FROM tbl_room
GROUP BY tbl_room.name, tbl_room.room_id;    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多