2013-04-07 34 views
3

我遇到以下查詢問題;這本身運行良好,但它按秒排序,我想截斷秒和分組。我已經用date_trunc進行了試驗,提取等等,但我沒有任何運氣。當引擎是sqlite時,提取('分鐘')工作正常,但不能用postgresql。group_by語句,sqlalchemy和postgresql的問題

任何人都可以指出我正確的方向嗎?

PostgreSQL的版本:PostgreSQL的23年1月8日在x86_64-紅帽Linux的GNU的

Column('id', Integer, primary_key=True), 
     Column('date', TIMESTAMP), 
     Column('src', String), 
     Column('dst', String), 
     Column('len', String), 
     Column('sport', String), 
     Column('dport', String), 
     Column('method', String), 
     Column('host', String), 
     Column('useragent', String), 
     Column('statusline', String), 
     Column('location', String), 
     Column('server', String), 
     Column('load', String), 

now = datetime.datetime.now()     
DD = now - datetime.timedelta(minutes=60)  
DD = DD.strftime('%Y-%m-%d %H:%M:%S')   
query = session.query(HTTP.date,HTTP.statusline, func.count(HTTP.statusline).                   
       label('count')).filter(HTTP.statusline.like('%'+status+'%'), HTTP.date>=(DD)).group_by(HTTP.date, HTTP.statusline).order_by(asc(HTTP.date)).all() 
+0

你忘了提供你的表格定義和你的postgres版本號。 – 2013-04-07 18:49:50

+0

誰在問這個問題? ohpaulsen或user2255212? – 2013-04-07 19:09:31

+0

@ ErwinBrandstetter ohpaulsen告訴我他們在一起工作,但他沒有評論特權。 – timss 2013-04-07 22:48:27

回答

3

在你做任何事情其他,考慮升級到的PostgreSQL 8.1 is long dead and forgotten當前版本。

不能完全確定有關的符號,但與@Audrius in the comments更新它應該像這樣工作:

query = session.query(
     date_trunc('min', http.date).label('date_minute') 
     ,http.statusline 
     ,func.count(http.statusline).label('count') 
    ).filter(http.statusline.contains(status) 
      ,http.date>=(DD) 
    ).group_by('date_minute' 
      ,http.statusline 
    ).order_by(asc('date_minute')).all() 

基本上,使用date_trunc('min', http.date)代替http.dateSELECTGROUP BYORDER BY別名。

順便說一句:我覺得使用date作爲timestamp的名稱非常具有誤導性。除此之外,我的建議是從來沒有使用任何基類型名稱作爲標識符。導致非常混亂的錯誤消息和其他難以調試的錯誤。

+3

''%'+ status +'%''很好,SQLAlchemy會做正確的當發佈實際的SQL時,儘管在這種情況下['.contains(status)'](http://docs.sqlalchemy.org/en/rel_0_8/core/schema.html#sqlalchemy.schema.Column.contains)清潔器。也可以使用來自'.label()'的'.group_by()'和'.order_by()'值。 '.group_by('date_minute',http.statusline)'。 – 2013-04-07 19:42:57

+0

@AudriusKažukauskas:謝謝,我使用了你的更新。 – 2013-04-07 20:28:32

+0

謝謝,這工作完美。 – flanders301 2013-04-08 11:32:28