rambo il y a 4 mois
Parent
commit
edbab26f62
2 fichiers modifiés avec 81 ajouts et 85 suppressions
  1. 78 83
      python/databases.py
  2. 3 2
      python/sockets/message_handler.py

+ 78 - 83
python/databases.py

@@ -1,13 +1,10 @@
-from networkx.algorithms.components import connected
 from sqlmodel import Field, Session, SQLModel, create_engine, select
 from typing import Dict
-from datetime import datetime
 from typing import Optional
-import json
 from sqlalchemy import and_, desc, asc
 from utils.utils_func import check_path
-from sqlalchemy.dialects import sqlite
 from model import DeviceConfig, PhotoRecord, SysConfigs, DeviceConfigTabs
+
 check_path("C:/Zhihuiyin")
 # 创建SQLite数据库引擎
 sqlite_file_name = "C:/Zhihuiyin/database.db"
@@ -15,6 +12,7 @@ sqlite_url = f"sqlite:///{sqlite_file_name}"
 engine = create_engine(
     sqlite_url,
     echo=False,
+    connect_args={"check_same_thread": False},  # 允许多线程访问
     pool_size=10,
     max_overflow=20,
     pool_timeout=30,
@@ -36,54 +34,6 @@ def __get_session():
             session.close()
 
 
-def batch_insert_device_configs(session: Session, action_tabs: list, data_list: list):
-    """批量插入数据到设备配置表"""
-    for idx, tab in enumerate(action_tabs):
-        crud = CRUD(DeviceConfigTabs)
-        device_tab = DeviceConfigTabs(
-            mode_type=tab.get("mode_type"),
-            mode_name=tab.get("mode_name"),
-        )
-        create_obj = crud.create(session, obj_in=device_tab)
-        for data in data_list:
-            data["tab_id"] = create_obj.id
-            data["is_system"] = False
-            if idx  in [0, 6]:
-                data["is_system"] = True
-            device_config = DeviceConfig(**data)
-            session.add(device_config)
-    session.commit()
-    session.close()
-
-
-def batch_insert_sys_configs(session: Session, data_list: list):
-    """批量插入数据到设备配置表"""
-    for data in data_list:
-        config = SysConfigs(**data)
-        session.add(config)
-    session.commit()
-    session.close()
-
-
-def insert_photo_records(
-    image_deal_mode: int, goods_art_no: str, image_index: int, action_id: int
-):
-    session = SqlQuery()
-    """批量插入数据到照片记录"""
-    data = {
-        "image_deal_mode": image_deal_mode,
-        "goods_art_no": goods_art_no,
-        "image_index": image_index,
-        "action_id": action_id,
-    }
-    device_config = PhotoRecord(**data)
-    session.add(device_config)
-    session.commit()
-    record_id = device_config.id
-    session.close()
-    return True, record_id
-
-
 # 创建一个通用的 CRUD 类
 class CRUD:
     def __init__(self, model):
@@ -95,7 +45,6 @@ class CRUD:
         session.add(db_obj)
         session.commit()
         session.refresh(db_obj)
-        session.close()
         return db_obj
 
     def read(
@@ -121,7 +70,6 @@ class CRUD:
             else:
                 query = query.order_by(desc(getattr(self.model, order_by)))
         data = session.exec(query).first()
-        session.close()
         return data
 
     def read_all(
@@ -162,43 +110,16 @@ class CRUD:
             else:
                 query = query.order_by(desc(getattr(self.model, order_by)))
         data = session.exec(query).all()
-        session.close()
         return data
 
     def update(self, session: Session, obj_id: int, **kwargs):
         db_obj = session.get(self.model, obj_id)
         for key, value in kwargs.items():
-            # if value == None or value == "":
-            #     continue
             setattr(db_obj, key, value)
         session.commit()
         session.refresh(db_obj)
-        session.close()
         return db_obj
 
-    def updateConditions(
-        self, session: Session, conditions: Optional[Dict] = None, **kwargs
-    ):
-        query = select(self.model)
-        if conditions:
-            query = query.where(
-                and_(
-                    *(
-                        getattr(self.model, key) == value
-                        for key, value in conditions.items()
-                    )
-                )
-            )
-        data = session.exec(query).first()
-        for key, value in kwargs.items():
-            if value == None or value == "":
-                continue
-            setattr(data, key, value)
-        session.commit()
-        session.refresh(data)
-        session.close()
-        return data
-
     def deleteConditions(
         self,
         session: Session,
@@ -219,14 +140,88 @@ class CRUD:
         for obj in objects_to_delete:
             session.delete(obj)
         session.commit()
-        session.close()
+        # session.refresh()
         return True
 
     def delete(self, session: Session, obj_id: int):
         db_obj = session.get(self.model, obj_id)
         session.delete(db_obj)
         session.commit()
-        session.close()
+        # session.refresh()
+
+    # 恢复 updateConditions 方法
+    def updateConditions(self, session: Session, conditions: Dict, **kwargs):
+        """
+        根据条件更新记录
+        :param session: 数据库会话
+        :param conditions: 更新条件字典
+        :param kwargs: 需要更新的字段和值
+        :return: 更新后的对象
+        """
+        query = select(self.model).where(
+            and_(
+                *(
+                    getattr(self.model, key) == value
+                    for key, value in conditions.items()
+                )
+            )
+        )
+        result = session.exec(query).first()
+        if result:
+            for key, value in kwargs.items():
+                setattr(result, key, value)
+            session.commit()  # 提交事务以保存更改
+            return result
+        return None
+
+
+# 批量插入数据到设备配置表
+def batch_insert_device_configs(session: Session, action_tabs: list, data_list: list):
+    """批量插入数据到设备配置表"""
+    for idx, tab in enumerate(action_tabs):
+        crud = CRUD(DeviceConfigTabs)
+        device_tab = DeviceConfigTabs(
+            mode_type=tab.get("mode_type"),
+            mode_name=tab.get("mode_name"),
+        )
+        create_obj = crud.create(session, obj_in=device_tab)
+        for data in data_list:
+            data["tab_id"] = create_obj.id
+            data["is_system"] = False
+            if idx in [0, 6]:
+                data["is_system"] = True
+            device_config = DeviceConfig(**data)
+            session.add(device_config)
+    session.commit()  # 合并事务提交
+
+
+# 批量插入系统配置
+def batch_insert_sys_configs(session: Session, data_list: list):
+    """批量插入数据到设备配置表"""
+    for data in data_list:
+        config = SysConfigs(**data)
+        session.add(config)
+    session.commit()  # 合并事务提交
+
+
+# 插入照片记录
+async def insert_photo_records(
+    image_deal_mode: int, goods_art_no: str, image_index: int, action_id: int
+):
+    with SqlQuery() as session:  # 使用上下文管理器复用会话
+        """批量插入数据到照片记录"""
+        data = {
+            "image_deal_mode": image_deal_mode,
+            "goods_art_no": goods_art_no,
+            "image_index": image_index,
+            "action_id": action_id,
+        }
+        device_config = PhotoRecord(**data)
+        session.add(device_config)
+        session.commit()
+        session.refresh(device_config)
+        record_id = device_config.id
+        return True, record_id
 
 
 def SqlQuery():

+ 3 - 2
python/sockets/message_handler.py

@@ -111,7 +111,7 @@ async def handlerSend(
                 data = manager.jsonMessage(code=1, msg="当前没有可用配置")
                 await manager.send_personal_message(data, websocket, msg_type=msg_type)
                 return
-            action_list = [device.model_dump() for device in all_devices]
+            action_list = [dict(device.__dict__) for device in all_devices]
             print("action_list", action_list)
             device_ctrl = DeviceControl(websocket_manager=manager)
             loop.create_task(
@@ -169,6 +169,7 @@ async def handlerSend(
             device_action = crud.read(
                 session, conditions=condtions
             )
+            device_result = dict(device_action.__dict__)
             if device_action == None:
                 # 判断是否有可用配置
                 data = manager.jsonMessage(code=1, msg="当前没有可用配置")
@@ -180,7 +181,7 @@ async def handlerSend(
             device_ctrl = DeviceControl(websocket_manager=manager)
             loop.create_task(
                 device_ctrl.run_mcu_config_single(
-                    device_action.model_dump(),
+                    device_result,
                     goods_art_no,
                     msg_type=msg_type,
                     image_index=image_index,