#!/usr/bin/python from doppelserver.models import StaticSample, load_session, HourSample from sqlalchemy import func import datetime session = load_session() def data_for_hour(start): end = start + datetime.timedelta(hours=1) # return the average of all data for an hour, starting from start # note the parentheses around the comparisons in the filter; this is # required because & binds tighter than comparison! return session.query(StaticSample.sensor_id, func.avg(StaticSample.data)) \ .filter((StaticSample.time >= start) & (StaticSample.time < end)) \ .group_by(StaticSample.sensor_id).all() if __name__ == "__main__": now = datetime.datetime.now() last_hour = datetime.datetime.now() - datetime.timedelta(hours=1, minutes=now.minute, seconds=now.second, microseconds=now.microsecond) try: for (id, datum) in data_for_hour(last_hour): session.add(HourSample(sensor_id=id, time=last_hour, data=datum)) except IntegrityError: session.rollback()