2017-09-23 2 views
0

Versuche, einige Abfragen zu verschieben Ich laufe täglich in ein automatisiertes Skript. Ich habe eine in Postgres wie unten:Auswählen des ersten Elements eines ARRAY mit Posgresql/SqlAlchemy

SELECT regexp_split_to_array(col1, "|")[1] AS item, COUNT(*) AS itemcount FROM Tabel1 GROUP BY item ORDER BY itemcount 

In sqlalchemy Ich habe dies:

session.query((func.regexp_split_to_array(model.table1.col1, "|")[1]).label("item"), func.count().label("itemcount")).group_by("item").order_by("itemcount") 

Python kann nicht "get_item", da es nicht eigentlich eine Sammlung ist. Ich habe die Dokumente durchgesehen und kann scheinbar nichts finden, was mir das erlauben würde, ohne raw SQL mit execute auszuführen (was ich tun und tun kann, aber nach einer Lösung für das nächste Mal suchte).

Vielen Dank!

Antwort

2

SQLAlchemy unterstützt Indexierung mit [...]. Wenn Sie einen Typ einer Spalte deklarieren, die Sie haben postgresql.ARRAY vom Typ sein, dann funktioniert es:

table2 = Table("table2", meta, Column("col1", postgresql.ARRAY(String))) 
q = session.query(table2.c.col1[1]) 
print(q.statement.compile(dialect=postgresql.dialect())) 
# SELECT table2.col1[%(col1_1)s] AS anon_1 
# FROM table2 

Der Grund, warum Ihr Code funktioniert nicht, dass SQLAlchemy nicht weiß, dass func.regexp_split_to_array(...) ein Array zurückgibt, da func.foo erzeugt eine allgemeine Funktion für die Bequemlichkeit. Damit es funktioniert, müssen wir sicher SQLAlchemy kennt den Rückgabetyp der Funktion machen, indem Sie die type_ Parameter angeben:

q = session.query(func.regexp_split_to_array(table1.c.col1, "|", type_=postgresql.ARRAY(String))[1].label("item")) 
print(q.statement.compile(dialect=postgresql.dialect())) 
# SELECT (regexp_split_to_array(table1.col1, %(regexp_split_to_array_1)s))[%(regexp_split_to_array_2)s] AS item 
# FROM table1 
+0

Benötigt sqlalchemy.types für String (die ich habe nicht aus Gründen eingeführt, die nicht gut), funktioniert aber ansonsten wie ein Zauber. Vielen Dank! – DR913

Verwandte Themen