2017-09-21 3 views
0

J'utilise flask_sqlalchemy et flask_restless pour créer un point de terminaison API pour accéder aux données d'une base de données PostgreSQL. Comment puis-je construire la requête SQL suivante dans flask-agile?Comment construire une requête SQL "group_by" dans flask-agité?

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

Cela renvoie toutes les paires de coordonnées qui appartiennent à "ABC ROAD" et la vitesse moyenne sur chaque paire de coordonnées:

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

Actuellement, cette requête:

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

Retours une chaîne JSON de toutes les données qui appartiennent à "ABC ROAD" et toutes les données de vitesse à des moments différents:

{ 
    "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 
} 
+0

Ne pouvez-vous pas définir votre propre point de terminaison pour exécuter ce SQL exactement? –

+0

Je peux écrire la même requête dans SQLAlchemy 'result = session.query (fonc.avg (TrafficData.SpeedBand), TrafficData.Location) .group_by (TrafficData.Location) .filter (TrafficData.RoadName == 'ABC ROAD') .all() ' mais comment dois-je écrire cela dans le point de terminaison? [link] (https://flask-restless.readthedocs.io/fr/stable/customizing.html) –

+0

Vous pouvez écrire cela dans une méthode ... https://flask-restless.readthedocs.io/en/ stable/customizing.html # custom-queries –

Répondre

0

Pour le groupe, vous devez spécifier feild dans le format suivant. group_by Une liste d'objets de forme:

{"field": <fieldname>} 

Ici est la colonne nomchamp à utiliser par groupe par.

+1

Avez-vous un exemple de comment cela fonctionne? J'ai essayé les '{" filters "suivants: [{" name ":" RoadName "," op ":" == "," val ":" ABC ROAD "}]," group_by ": [{" champ ":" Emplacement "}]}' mais obtenez une réponse ProgrammingError. –