2010-06-15 5 views
6

J'ai donc une table avec un datestamp et deux champs que je veux m'assurer qu'ils sont uniques le mois dernier.SQLAlchemy: Comment grouper par deux champs et filtrer par date

table.id 
table.datestamp 
table.field1 
table.field2 

Il ne devrait pas y avoir d'enregistrement en double avec la même valeur composée field1 + 2 au cours du dernier mois.

Les étapes de ma tête sont:

  1. Groupe par les deux champs
  2. Retour sur les données du dernier mois pour vous assurer que ce groupe unique, ne se produit pas.

J'ai jusque-là, mais je ne pense pas que cela fonctionne:

result = session.query(table).group_by(\ 
    table.field1, 
    table.field2, 
    func.month(table.timestamp)) 

Mais je ne suis pas sûr comment faire cela dans sqlalchemy. Quelqu'un pourrait-il me conseiller?

Merci beaucoup!

+0

Merci à l'avance, les gars – 0atman

Répondre

15

ci-dessus vous diriger dans la bonne direction, voir également commentaires en ligne:

qry = (session.query(
       table.c.field1, 
       table.c.field2, 
       # #strftime* for year-month works on sqlite; 
       # @todo: find proper function for mysql (as in the question) 
       # Also it is not clear if only MONTH part is enough, so that 
       # May-2001 and May-2009 can be joined, or YEAR-MONTH must be used 
       func.strftime('%Y-%m', table.c.datestamp), 
       func.count(), 
       ) 
     # optionally check only last 2 month data (could have partial months) 
     .filter(table.c.datestamp < datetime.date.today() - datetime.timedelta(60)) 
     .group_by(
       table.c.field1, 
       table.c.field2, 
       func.strftime('%Y-%m', table.c.datestamp), 
       ) 
     # comment this line out to see all the groups 
     .having(func.count()>1) 
    ) 
+0

Merci beaucoup van, mais votre solution pokes des trous dans ma connaissance de sqlalchemy, quelle est l'importance de l'attribut 'c' de l'objet table? – 0atman

+0

si vous avez un objet 'table', alors' c' est un raccourci vers 'columns'. Voir Didacticiel sur le langage SQL: http://www.sqlalchemy.org/docs/sqlexpression.html?highlight=group_by#ordering-grouping-limiting-offseting – van

+0

Ne vous inquiétez pas, j'aurais dû simplement googler ma question, car c'est souvent le cas! – 0atman