【问题标题】:How to construct a "group_by" SQL query in flask-restless?如何在flask-restless中构造“group_by”SQL查询?
【发布时间】:2018-03-02 05:45:32
【问题描述】:

我正在使用 flask_sqlalchemy 和 flask_restless 创建一个 API 端点来访问来自 PostgreSQL 数据库的数据。如何在flask-restless中构造如下SQL查询?

SELECT AVG("SpeedBand"), "Location"
FROM public.traffic_data
WHERE "RoadName"='ABC ROAD'
GROUP BY "Location"

这将返回属于“ABC ROAD”的所有坐标对以及每对坐标的平均速度:

   avg   | Location
 ------------------------
1)'1.52' | 'X1 Y1 X2 Y2'
2)'1.85' | 'X3 Y3 X4 Y4'
 ------------------------

目前,这个查询:

http://127.0.0.1:5000/api/traffic_data?q={"filters":[{"name":"RoadName","op":"==","val":"ABC ROAD"}]}

返回属于“ABC ROAD”的所有数据和不同时间的所有速度数据的JSON字符串:

{
  "num_results": 26, 
  "objects": [
    {
      "DateTime": "2017-09-07T19:25:37.035325", 
      "LinkID": "109002906", 
      "Location": "X1 Y1 X2 Y2", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 3, 
      "id": 34094
    }, 
    {
      "DateTime": "2017-09-07T19:25:37.035325", 
      "LinkID": "109002907", 
      "Location": "X3 Y3 X4 Y4", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 1, 
      "id": 38003
    }, 
    {
      "DateTime": "2017-09-13T09:57:07.163900", 
      "LinkID": "109002906", 
      "Location": "X1 Y1 X2 Y2", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 1, 
      "id": 92874
    }, 
    {
      "DateTime": "2017-09-13T09:57:07.163900", 
      "LinkID": "109002907", 
      "Location": "X3 Y3 X4 Y4", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 1, 
      "id": 96783
    }, 
    {
      "DateTime": "2017-09-13T09:57:07.163900", 
      "LinkID": "109002906", 
      "Location": "X1 Y1 X2 Y2", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 1, 
      "id": 114755
    }, 
    {
      "DateTime": "2017-09-13T09:57:07.163900", 
      "LinkID": "109002907", 
      "Location": "X3 Y3 X4 Y4", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 2, 
      "id": 114756
    }, 
    {
      "DateTime": "2017-09-13T10:08:17.727949", 
      "LinkID": "109002906", 
      "Location": "X1 Y1 X2 Y2", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 2, 
      "id": 151654
    }, 
    {
      "DateTime": "2017-09-13T10:08:17.727949", 
      "LinkID": "109002907", 
      "Location": "X3 Y3 X4 Y4", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 2, 
      "id": 155563
    }, 
    {
      "DateTime": "2017-09-13T10:19:39.040191", 
      "LinkID": "109002906", 
      "Location": "X1 Y1 X2 Y2", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 2, 
      "id": 210434
    }, 
    {
      "DateTime": "2017-09-13T10:19:39.040191", 
      "LinkID": "109002907", 
      "Location": "X3 Y3 X4 Y4", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 2, 
      "id": 214343
    }, 
    {
      "DateTime": "2017-09-13T10:27:51.307349", 
      "LinkID": "109002906", 
      "Location": "X1 Y1 X2 Y2", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 2, 
      "id": 269214
    }, 
    {
      "DateTime": "2017-09-13T10:42:36.724985", 
      "LinkID": "109002906", 
      "Location": "X1 Y1 X2 Y2", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 2, 
      "id": 327994
    }, 
    {
      "DateTime": "2017-09-13T10:42:36.724985", 
      "LinkID": "109002907", 
      "Location": "X3 Y3 X4 Y4", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 2, 
      "id": 331903
    }, 
    {
      "DateTime": "2017-09-13T10:42:36.724985", 
      "LinkID": "109002906", 
      "Location": "X1 Y1 X2 Y2", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 1, 
      "id": 349875
    }, 
    {
      "DateTime": "2017-09-13T10:42:36.724985", 
      "LinkID": "109002907", 
      "Location": "X3 Y3 X4 Y4", 
      "RoadName": "ABC ROAD", 
      "SpeedBand": 2, 
      "id": 349876
    },

    . . .


  ], 
  "page": 1, 
  "total_pages": 1
}

【问题讨论】:

  • 您不能定义自己的端点来准确运行该 SQL 吗?
  • 我可以在 SQLAlchemy result =session.query(func.avg(TrafficData.SpeedBand),TrafficData.Location).group_by(TrafficData.Location).filter(TrafficData.RoadName == 'ABC ROAD').all() 中编写相同的查询,但我应该如何将其写入端点? link
  • 你可以把它写成一个方法...flask-restless.readthedocs.io/en/stable/…
  • 它返回一个 ProgrammingError。在日志消息中,正在运行的 SQL 查询是:[SQL: 'SELECT avg(traffic_data."SpeedBand") AS avg_1, traffic_data."Location" AS "traffic_data_Location" \nFROM traffic_data \nWHERE traffic_data."RoadName" = %(RoadName_1)s GROUP BY traffic_data."Location" ORDER BY traffic_data.id ASC \n LIMIT %(param_1)s'] [parameters: {'RoadName_1': 'ABC ROAD', 'param_1': 13}]。默认情况下,该脚本试图通过“id”字段以升序对响应进行排序,这是不可能的,因为我们按“group_by”排序。任何想法如何删除该默认查询?
  • 不确定,但您可以定义一个普通的 Flask 端点来接受/返回必要的数据

标签: python postgresql flask flask-sqlalchemy flask-restless


【解决方案1】:

对于 group by,您需要按以下格式指定 feild。 通过...分组 表单对象列表:

{"field": <fieldname>}

这里的fieldname是group by要使用的列。

【讨论】:

  • 你有一个例子说明这是如何工作的吗?我尝试了以下{"filters":[{"name":"RoadName","op":"==","val":"ABC ROAD"}],"group_by":[{"field":"Location"}]},但得到了 ProgrammingError 响应。
猜你喜欢
  • 2013-01-22
  • 2016-09-10
  • 1970-01-01
  • 2019-07-15
  • 2018-08-15
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
相关资源
最近更新 更多