2015-09-04 32 views
1

A Sensor有许多Reading s,每个值在时间戳处具有值和类型。我想在Sensor上创建一个属性,以列出每种类型的最新值。我知道如何在SQL中得到这个,但我怎样才能用SQLAlchemy构造它?获取最新在SQLAlchemy中传感器的每种类型的读取值

select * from (
    select * from Readings 
    left join Sensors on Readings.SensorID = Sensors.SensorID 
    where Readings.SensorID = passed_id order by Timestamp desc 
) as tmp group by ValueType; 
class Reading(db.Model): 
    __tablename__ = 'Readings' 
    index = db.Column('id', db.Integer, primary_key=True) 
    sensor_id = db.Column('SensorID', db.Integer, db.ForeignKey('Sensors.SensorID')) 
    sensor_type = db.Column('SensorType', db.Integer) 
    timestamp = db.Column('Timestamp', db.DateTime) 
    value_type = db.Column('ValueType', db.Integer) 
    value = db.Column('Value', db.Float) 

class Sensor(db.Model): 
    __tablename__ = 'Sensors' 
    index = db.Column('id', db.Integer, primary_key=True) 
    id = db.Column('SensorID', db.Integer, unique=True) 
    type = db.Column('SensorType', db.Integer) 
    location = db.Column('Location', db.String(50)) 
    readings = db.relationship('Reading', backref='SensorID', lazy='dynamic') 
+1

我编辑'database.'到'db.'只是为了减少冗长和可读性。使用'db.'是Flask-SQLAlchemy的标准做法。 – davidism

回答

0

看来,我终于找到了解决办法。我在Sensor类中添加了以下内容:

@property 
def last_readings(self): 
    sub = object_session(self) \ 
      .query(Reading.value, Reading.value_type.label('value_type')) \ 
      .filter(Reading.sensor_id == self.id) \ 
      .order_by(Reading.timestamp.desc()).subquery() 
    return object_session(self).query(sub).group_by(sub.c.value_type)