2013-06-06 11 views
5

私はsqlalchemyを使用して選択クエリを作成しようとしていますが、計算された値で結果を並べ替える必要があります。計算列によるSqlalchemyの順序

基本的に、私は「のstart_time」と「END_TIME」の列を持っていると私はSTART_TIMEに基づいて結果を注文したいし、その後END_TIMEが、私はそれに86400000を追加したいEND_TIME < start_timeの場合:

end_time + (86400000 if end_time < start_time else 0) 

私はそれを行う方法を理解することはできません。計算されたプロパティをテーブルクラスに追加し、クエリでそのプロパティを取得する簡単な方法はありますか?

私は、計算されたend_timeのゲッターを作成するために@propertyを使用しようとしましたが、動作しませんでした。

答えて

6

まず、あなたが定義された列を使用して、クエリを構築するよりもあなたの式は、SQL機能(複数可)

として実装が含まれます列を定義する必要があります。

col = tclass.end_time + case([(tclass.end_time<tclass.start_time, 86400000)], else_=0) 
q = session.query(col).order_by(col) 
print q 

ように計算を追加する方法もありますマップされたオブジェクトのクラスdefintionにコラム:

class TName(Base): 
    end_time = Column(Integer) 
    start_time = Column(Integer) 
    calc_column = end_time + case([(end_time<start_time, 86400000)], else_=0) 

q2 = session.query(TName.calc_column).order_by(TName.calc_column) 
+0

Thidは動作しますが、テーブルに計算されたプロパティを追加してクエリが常にそれを取得できるようにする方法がありますか?このプロパティはDBに格納しないでください。 – Ofir

+0

これはSQLAlchemyでも実行可能です - 私の回答への更新を参照してください – vvladymyrov

+0

とてもシンプルで上品です!素晴らしい! 10x – Ofir

0

sqlalchemy documentationは今、これを行うには、ハイブリッドを使用することを推奨しているようです。

例:

from sqlalchemy.ext.hybrid import hybrid_property 

class Tname(Base): 
    end_time = Column(Integer) 
    start_time = Column(Integer) 

    @hybrid_property 
    def calc_column(self): 
     if self.end_time < self.start_time: 
      return self.end_time + 86400000 
     else: 
      return self.end_time 

次に、あなただけのcalc_columnにより、一般的な問い合わせや注文を実行することができます。

+0

計算はデータベース内で行うのか、Pythonアプリケーションコードで行うのでしょうか? Pythonであれば、ネットワーク上で多くのデータをシャッフルすることができます。これは、DB内で計算を行うことで回避できます(WHERE句でcalc_columnを使用する場合など)。 – btubbs

+0

propertyのexpressionを指定すると、db側の値を計算するために使用されます。そうでない場合はPythonで使用されます。 – zgoda

関連する問題