SQLAlchemy带有限制的查询的最小值/最大值

时间:2018-07-29 17:37:18

标签: python sqlalchemy flask-sqlalchemy

大家好,

我有几个读取温度和湿度的传感器。使用SQLAlchemy,我成功使用以下命令查询每个传感器的最后十个结果:

/usr/local/bin/mavproxy.py --daemon --non-interactive --master=$PORT | grep 'Failed' &> tmp.txt &
sleep 3

# If file exists and it's size is greater than 0, [ -s File] will return true
if [ -s tmp.txt ]; then 
   echo 'pattern exists'
else
   echo 'pattern not exists'
fi

现在我想要十个结果的最小值和最大值,因此我可以展示每个传感器的结果。像这样:

 sensorlist = db.session.query(Sensor).order_by(Sensor.id.asc()).all()
    for sensor in sensorlist:
        readings = sensor.readings.order_by(Sensorreading.time.desc()).limit(10)

但是我不知道如何使用SQLAlchemy / python进行查询。对于每次阅读,我都是使用此代码完成的,但是随后在计算最小值/最大值之前,我无法使其限制数据。如果我将.all()替换为.limit(10),则它仅查询十个传感器,而不是十个读数:

<sensor 1, min temp = 23, max temp = 26, min hum = 56, max hum =74>
<sensor 2, min temp = 22, max temp = 30, min hum = 51, max hum =63>
<sensor 3, min temp = 24, max temp = 25, min hum = 62, max hum =75>

仅出于一些背景信息,我的桌子的模型:

sensors = db.session.query(Sensor.name, db.func.min(Sensorreading.temp_value).label("temp_value_min"), db.func.max(Sensorreading.temp_value).label("temp_value_max")).outerjoin(Sensorreading, Sensor.id == Sensorreading.sensor_id).group_by(Sensor.name).all()

希望有人可以提供帮助。欢迎任何提示,技巧,代码帮助或链接!提前致谢。

2 个答案:

答案 0 :(得分:0)

它将返回整个列表,您可以在python列表中使用切片

sensors = db.session.query(Sensor.name, db.func.min(Sensorreading.temp_value).label("temp_value_min"), db.func.max(Sensorreading.temp_value).label("temp_value_max")).outerjoin(Sensorreading, Sensor.id == Sensorreading.sensor_id).group_by(Sensor.name).all()[:10]

答案 1 :(得分:0)

我认为在这种情况下最好使用限制和偏移量。如果您从sql返回大数据集并将其切片在内存中,这将导致不必要的开销。

此解决方案将返回包含10个项目的数据集(分页发生在sql端):

sensors = db.session.query(Sensor.name, db.func.min(Sensorreading.temp_value).label("temp_value_min"), db.func.max(Sensorreading.temp_value).label("temp_value_max")).outerjoin(Sensorreading, Sensor.id == Sensorreading.sensor_id).group_by(Sensor.name).limit(10).offset(0).all()

对于偏移量,您需要第一项-1。因此,页面1从项目1开始,您需要将偏移量设为0。对于页面2,偏移量将为11-1 = 10。