2017-09-23 8 views
0

いくつかのクエリを移動しようとしています。毎日自動スクリプトに実行します。私は以下のようにPostgresの1つを持っている:SQLAlchemyの中Posgresql/SqlAlchemyでARRAYの最初の項目を選択

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

私はこれを持っている:

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" することはできません。私はドキュメントを見てきましたが、実行して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は便宜上汎用関数を生成します。それを動作させるために、我々はtype_パラメータを指定することで、SQLAlchemyのは、関数の戻り値の型を知っていることを確認する必要があります。

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

関連する問題