Browse Source

智能插座开关日志原生SQL查询

zhangdongming 1 year ago
parent
commit
a1aea8fcad
1 changed files with 30 additions and 16 deletions
  1. 30 16
      Controller/SensorGateway/SmartSocketController.py

+ 30 - 16
Controller/SensorGateway/SmartSocketController.py

@@ -13,7 +13,7 @@ import time
 
 import requests
 from dateutil.parser import parse
-from django.db import transaction
+from django.db import transaction, connection, connections
 from django.db.models import Sum, Count
 from django.http import QueryDict
 from django.views import View
@@ -578,25 +578,39 @@ class SmartSocketView(View):
         page, size = int(page), int(size)
 
         try:
-            scene_log_qs = SceneLog.objects.filter(device_id=serial_number).values('tasks', 'status',
-                                                                                   'created_time')
-            if startTime is None and endTime is None:
-                scene_log_qs = scene_log_qs.order_by('-created_time')[(page - 1) * size:page * size]
-                if not scene_log_qs.exists():
-                    return response.json(0, [])
+            sql_query = """
+                        SELECT DISTINCT 
+                            tasks,
+                            status,
+                            created_time
+                        FROM scene_log
+                        WHERE device_id = %s {}
+                        ORDER BY created_time,id DESC
+                        LIMIT %s, %s;
+                    """
+
+            params = [serial_number]
+
+            if startTime is not None and endTime is not None:
+                sql_query = sql_query.format(
+                    "AND created_time >= %s AND created_time < %s ")
+                params.extend([startTime, endTime])
             else:
-                scene_log_qs = scene_log_qs.filter(device_id=serial_number, created_time__gte=startTime,
-                                                   created_time__lt=endTime).order_by(
-                    '-created_time', '-id')[(page - 1) * size:page * size]
-                if not scene_log_qs.exists():
-                    return response.json(0, [])
+                sql_query = sql_query.format(" ")
+            params.extend([(page - 1) * size, size])
+            cursor = connections['mysql02'].cursor()
+            cursor.execute(sql_query, params)
+            results = cursor.fetchall()
+            # 关闭游标
+            cursor.close()
+            connections.close_all()
             log_list = []
-            for scene_log in scene_log_qs:
+            for result in results:
                 data = {
                     'serialNumber': serial_number,
-                    'tasks': scene_log['tasks'] if scene_log['tasks'] else '',
-                    'status': scene_log['status'],
-                    'createdTime': scene_log['created_time'],
+                    'tasks': result[0] if result[0] else '',
+                    'status': result[1],
+                    'createdTime': result[2],
                 }
                 log_list.append(data)
             return response.json(0, log_list)