提问者:小点点

如何使用Django从数据库中检查索引号?


我有一个内置在Django的系统可以接收数据。我将数据存储如下:

 id | sensor | message_id | value
----+--------+------------+-------
 1  | A      | 1          | xxx    
 2  | A      | 2          | xxx
 3  | A      | 3          | xxx
 4  | B      | 1          | xxx
 5  | B      | 2          | xxx
 6  | B      | 4          | xxx
 7  | B      | 7          | xxx

我们期望每个传感器的message_id在每个后续消息中增加一个。如您所见,传感器B的message_id为:1、2、4、7。这意味着传感器B丢失了编号为3、5和6的消息。在这种情况下,我们需要调查丢失的消息,特别是如果丢失了很多消息。所以我现在想要一种方法,当它发生的时候,知道这些丢失的消息。

所以我想检查一下在过去的五分钟内是否缺少一条消息。我希望输出如下所示:

传感器B在过去5分钟内缺少3条消息。缺少以下ID:3、5、6

我想到的最简单的方法是查询一个传感器的message_id,然后循环访问它们,检查是否跳过了任何数字。我想到了这样的事情:

five_minutes_ago = datetime.now() - timedelta(minutes=5)
queryset = MessageData.objects.filter(created__gt=five_minutes_ago).filter(sensor='B').order_by('message_id')
last_message_id = None
for md in queryset:
    if last_message_id is None:
        last_message_id = md.message_id
    else:
        if md.message_id != last_message_id + 1:
            missing_messages = md.message_id - last_message_id - 1
            print(f"{missing_messages} messages missing for sensor {md.sensor}")

但由于我有数百个传感器,这似乎不是最好的方法。甚至可以在SQL本身中实现,但我不知道有什么方法可以这样做。

有谁能给我一个如何有效地做到这一点的建议吗?


共1个答案

匿名用户

您可以尝试类似这样的东西,我已经为逻辑添加了上面的注释,如果有任何查询,请随意评论。

five_minutes_ago = datetime.now() - timedelta(minutes=5)
queryset = MessageData.objects.filter(created__gt=five_minutes_ago).filter(sensor='B').order_by('message_id')

# rows that should ideally be there if no message_id was missing, i.e. equal to last message_id
ideal_num_of_rows = queryset.last().message_id

# total number of message_id present
total_num_of_row_present = queryset.count()

# number of missing message_ids 
num_of_missing_message_ids = ideal_num_of_rows - total_num_of_rows_present - 1