2015-02-16 2 views
5

Wie würde ich die folgende Abfrage mit SQLAlchemy ORM schreiben?Packen Sie einen PostGIS/PostgreSQL-Datensatz mit SQLAlchemy

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

Hier ST_SummaryStats ist ein PostGIS-Funktion, die den Datensatz zurückgibt, die ich auspacken wollen. tiles ist eine PostGIS-Tabelle mit den Spalten filename und rast (Raster). Mein Versuch ist wie folgt:

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, 
) 

Aber ich weiß nicht, wie der (stats).* Ausdruck schreiben - und damit den Rekord auspacken - mit SQLAlchemy ORM. Folglich scheint stats ein Tupel zu sein.

Vielen Dank im Voraus für jede Hilfe.

Antwort

0

ST_SummaryStats() gibt ein record, so anstatt sie als einen SELECT Ausdruck (was die record zurückkehren würde), verwenden Sie es als FROM Klausel und die gewünschten Statistiken auf SELECT Ebene wählen, so wird es sehr einfach:

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

Dies führt zu einem sogenannten LATERAL JOIN und da ST_SummaryStats() gibt nur eine einzige Zeile für die angezeigten raster in tiles Sie einen Zustand, Filter oder irgendetwas anderes nicht brauchen mitmachen.

Ich bin nicht sicher über SQLAlchemy Fähigkeit das Ergebnis einer Funktion als eine Klasse zu verwenden, aber ein sicherer Weg, diese Arbeit zu machen, die oben SELECT in eine VIEW wickeln und dann die von SQLAlchemy Ansicht zugreifen:

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