|
|
@@ -4,7 +4,7 @@ from typing import Dict
|
|
|
from datetime import datetime
|
|
|
from typing import Optional
|
|
|
import json
|
|
|
-from sqlalchemy import and_, desc, asc, delete,inspect
|
|
|
+from sqlalchemy import and_, desc, asc, delete, inspect
|
|
|
import settings
|
|
|
from utils.utils_func import check_path
|
|
|
from sqlalchemy.dialects import sqlite
|
|
|
@@ -18,10 +18,10 @@ engine = create_engine(
|
|
|
sqlite_url,
|
|
|
echo=False,
|
|
|
connect_args={"check_same_thread": False},
|
|
|
- pool_size=20, # 增加基础连接池大小
|
|
|
- max_overflow=30, # 增加最大溢出连接数
|
|
|
- pool_timeout=60, # 保持合理的超时时间
|
|
|
- pool_recycle=1800, # 连接回收时间(秒)
|
|
|
+ pool_size=20, # 增加基础连接池大小
|
|
|
+ max_overflow=30, # 增加最大溢出连接数
|
|
|
+ pool_timeout=60, # 保持合理的超时时间
|
|
|
+ pool_recycle=1800, # 连接回收时间(秒)
|
|
|
pool_pre_ping=True, # 检查连接有效性
|
|
|
)
|
|
|
|
|
|
@@ -66,11 +66,11 @@ class CRUD:
|
|
|
return result.rowcount
|
|
|
|
|
|
def read(
|
|
|
- self,
|
|
|
- session: Session,
|
|
|
- conditions: Optional[Dict] = None,
|
|
|
- order_by: Optional[str] = None,
|
|
|
- ascending: bool = True,
|
|
|
+ self,
|
|
|
+ session: Session,
|
|
|
+ conditions: Optional[Dict] = None,
|
|
|
+ order_by: Optional[str] = None,
|
|
|
+ ascending: bool = True,
|
|
|
):
|
|
|
query = select(self.model)
|
|
|
if conditions:
|
|
|
@@ -91,12 +91,12 @@ class CRUD:
|
|
|
return data
|
|
|
|
|
|
def read_all(
|
|
|
- self,
|
|
|
- session: Session,
|
|
|
- conditions: Optional[Dict] = None,
|
|
|
- order_by: Optional[str] = None,
|
|
|
- ascending: bool = True,
|
|
|
- join_conditions: Optional[list] = None, # 新增:支持多个JOIN
|
|
|
+ self,
|
|
|
+ session: Session,
|
|
|
+ conditions: Optional[Dict] = None,
|
|
|
+ order_by: Optional[str] = None,
|
|
|
+ ascending: bool = True,
|
|
|
+ join_conditions: Optional[list] = None, # 新增:支持多个JOIN
|
|
|
):
|
|
|
query = select(self.model)
|
|
|
# 处理JOIN逻辑
|
|
|
@@ -139,15 +139,15 @@ class CRUD:
|
|
|
return db_obj
|
|
|
|
|
|
def deleteConditions(
|
|
|
- self,
|
|
|
- session: Session,
|
|
|
- conditions: Optional[Dict] = None,
|
|
|
- is_soft_delete: bool = True,
|
|
|
+ self,
|
|
|
+ session: Session,
|
|
|
+ conditions: Optional[Dict] = None,
|
|
|
+ is_soft_delete: bool = True,
|
|
|
):
|
|
|
query = select(self.model)
|
|
|
if conditions is None:
|
|
|
return False
|
|
|
-
|
|
|
+
|
|
|
# 构建查询条件
|
|
|
query = query.where(
|
|
|
and_(
|
|
|
@@ -157,13 +157,13 @@ class CRUD:
|
|
|
)
|
|
|
)
|
|
|
)
|
|
|
-
|
|
|
+
|
|
|
# 获取需要删除的对象
|
|
|
objects_to_delete = session.exec(query).all()
|
|
|
-
|
|
|
+
|
|
|
# 检查模型是否包含 delete_time 字段
|
|
|
model_columns = {column.name for column in inspect(self.model).columns}
|
|
|
- if 'delete_time' in model_columns and is_soft_delete ==True:
|
|
|
+ if 'delete_time' in model_columns and is_soft_delete == True:
|
|
|
# 软删除:更新 delete_time 字段
|
|
|
for obj in objects_to_delete:
|
|
|
setattr(obj, 'delete_time', datetime.now())
|
|
|
@@ -175,7 +175,7 @@ class CRUD:
|
|
|
session.delete(obj)
|
|
|
session.commit()
|
|
|
print("硬删除完成")
|
|
|
-
|
|
|
+
|
|
|
return True
|
|
|
|
|
|
def delete(self, session: Session, obj_id: int):
|
|
|
@@ -201,7 +201,7 @@ class CRUD:
|
|
|
)
|
|
|
)
|
|
|
)
|
|
|
- print("SQL 打印==>",str(query))
|
|
|
+ print("SQL 打印==>", str(query))
|
|
|
result = session.exec(query).first()
|
|
|
if result:
|
|
|
for key, value in kwargs.items():
|
|
|
@@ -258,7 +258,7 @@ def batch_insert_device_configs(session: Session, action_tabs: list, data_list:
|
|
|
|
|
|
|
|
|
def batch_insert_device_configsNew(
|
|
|
- session: Session, action_tabs: list, data_list: list
|
|
|
+ session: Session, action_tabs: list, data_list: list
|
|
|
):
|
|
|
"""批量插入数据到设备配置表"""
|
|
|
for idx, tab in enumerate(action_tabs):
|
|
|
@@ -291,7 +291,7 @@ def batch_insert_sys_configs(session: Session, data_list: list):
|
|
|
|
|
|
# 插入照片记录
|
|
|
async def insert_photo_records(
|
|
|
- image_deal_mode: int, goods_art_no: str, image_index: int, action_id: int
|
|
|
+ image_deal_mode: int, goods_art_no: str, image_index: int, action_id: int
|
|
|
):
|
|
|
with SqlQuery() as session: # 使用上下文管理器复用会话
|
|
|
"""批量插入数据到照片记录"""
|
|
|
@@ -314,42 +314,42 @@ async def insert_photo_records(
|
|
|
"action_id": action_id,
|
|
|
}
|
|
|
# 异步插入一条数据
|
|
|
- settings.syncPhotoRecord(syncData,action_type=1)
|
|
|
+ settings.syncPhotoRecord(syncData, action_type=1)
|
|
|
return True, record_id
|
|
|
|
|
|
|
|
|
def auto_add_missing_columns():
|
|
|
-
|
|
|
"""
|
|
|
自动检测并添加缺失的数据库字段(最简化版本)
|
|
|
只为 device_config 表添加缺失的字段
|
|
|
"""
|
|
|
try:
|
|
|
import sqlite3
|
|
|
-
|
|
|
+
|
|
|
# 连接数据库
|
|
|
conn = sqlite3.connect(sqlite_file_name)
|
|
|
cursor = conn.cursor()
|
|
|
-
|
|
|
+
|
|
|
# 检查表是否存在
|
|
|
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='device_config'")
|
|
|
if not cursor.fetchone():
|
|
|
conn.close()
|
|
|
return
|
|
|
-
|
|
|
+
|
|
|
# 获取现有字段
|
|
|
cursor.execute("PRAGMA table_info(device_config)")
|
|
|
existing_columns = [row[1] for row in cursor.fetchall()]
|
|
|
-
|
|
|
+
|
|
|
# 定义需要添加的字段
|
|
|
# 格式: (字段名, SQL类型, 默认值)
|
|
|
# 根据你在 DeviceConfig model 中新增的字段来配置
|
|
|
new_fields = [
|
|
|
# 请在这里添加你实际新增的字段
|
|
|
("point_name", "VARCHAR", "DEFAULT 'A'"),
|
|
|
- ("is_move_device", "BOOLEAN", "DEFAULT 1")
|
|
|
+ ("is_move_device", "BOOLEAN", "DEFAULT 1"),
|
|
|
+ ("camera_focal_distance", "INT", "DEFAULT 0")
|
|
|
]
|
|
|
-
|
|
|
+
|
|
|
# 添加缺失的字段
|
|
|
for field_name, field_type, default_clause in new_fields:
|
|
|
if field_name not in existing_columns:
|
|
|
@@ -360,16 +360,14 @@ def auto_add_missing_columns():
|
|
|
except Exception as e:
|
|
|
print(f"⚠️ 添加字段失败: {e}")
|
|
|
pass # 忽略错误,继续下一个
|
|
|
-
|
|
|
+
|
|
|
conn.close()
|
|
|
-
|
|
|
+
|
|
|
except Exception as e:
|
|
|
print(f"⚠️ 添加字段失败: {e}")
|
|
|
pass # 静默失败,不影响启动
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
def SqlQuery():
|
|
|
return next(__get_session())
|
|
|
|