2017-09-23 76 views
0

嘗試將每天運行的查詢移動到自動腳本中。我有一個在Postgres的形式大致如下:用Posgresql/SqlAlchemy選擇ARRAY的第一項

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

在SQLAlchemy中我有這樣的:

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

Python不能 「get_item」,因爲它實際上並不是一個集合。我查看了文檔,似乎無法找到能夠讓我在不使用execute的情況下運行原始SQL的情況下(我可以這樣做,但仍在尋找下一次解決方案)。

謝謝大家!

回答

2

SQLAlchemy確實支持[...]索引。如果您聲明一個類型的列,你必須要postgresql.ARRAY類型,那麼它的工作原理:

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 

之所以你的代碼不起作用的是,SQLAlchemy的不知道func.regexp_split_to_array(...)返回一個數組,因爲爲方便起見,func.foo產生通用功能。爲了使其工作,我們需要確保的SQLAlchemy知道函數的返回類型,通過指定type_參數:

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

需要字符串sqlalchemy.types(我沒得進口的原因,也不好),但除此之外就像魅力一樣。謝謝! – DR913

相關問題