【发布时间】: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