2015-02-16 3 views
5

Come scrivere la seguente query utilizzando l'ORM di SQLAlchemy?Estrarre un record PostGIS/PostgreSQL con SQLAlchemy

SELECT filename, (stats).* 
FROM (
    SELECT filename, ST_SummaryStats(rast, 1, TRUE) AS stats FROM tiles 
) AS stats_table; 

Qui, ST_SummaryStats è una funzione PostGIS che restituisce il record che voglio disfare. tiles è una tabella PostGIS con colonne filename e rast (raster). Il mio tentativo è la seguente:

sub_q = db_session.query(
    Tiles.filename, 
    func.ST_SummaryStats(Tiles.rast, 1, True).label('stats'), 
).subquery() 

q = db_session.query(
    sub_q.columns.filename, 
    sub_q.columns.stats, 
) 

Tuttavia, non so come scrivere l'espressione (stats).* - e quindi decomprimere il record - con ORM di SQLAlchemy. Di conseguenza, stats sembra essere una tupla.

Grazie in anticipo per qualsiasi aiuto.

risposta

0

ST_SummaryStats() restituisce una record, così piuttosto che lo usano come un'espressione SELECT (che sarebbe tornato il record), lo usano come una clausola FROM e raccogliere le statistiche desiderati a livello SELECT, così diventa molto semplice:

SELECT filename, count, sum, mean, stddev, min, max 
FROM tiles, ST_SummaryStats(tiles.rast, 1, true); 

Ciò si traduce in una cosiddetta LATERAL JOIN e dal ST_SummaryStats() restituisce solo una singola riga per l'indicato raster in tiles non hai bisogno di una condizione di join, filtro o qualsiasi altra cosa.

Non sono sicuro circa la capacità di SQLAlchemy di utilizzare il risultato di una funzione come classe, ma un modo infallibile per fare questo lavoro è quello di avvolgere il sopra SELECT in un VIEW e quindi accedere alla vista da SQLAlchemy:

CREATE VIEW raster_stats AS 
    SELECT filename, count, sum, mean, stddev, min, max 
    FROM tiles, ST_SummaryStats(tiles.rast, 1, true);