databases.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. from networkx.algorithms.components import connected
  2. from sqlmodel import Field, Session, SQLModel, create_engine, select
  3. from typing import Dict
  4. from datetime import datetime
  5. from typing import Optional
  6. import json
  7. from sqlalchemy import and_, desc, asc, delete
  8. from utils.utils_func import check_path
  9. from sqlalchemy.dialects import sqlite
  10. from model import DeviceConfig, PhotoRecord, SysConfigs, DeviceConfigTabs
  11. check_path("C:/Zhihuiyin")
  12. # 创建SQLite数据库引擎
  13. sqlite_file_name = "C:/Zhihuiyin/database.db"
  14. sqlite_url = f"sqlite:///{sqlite_file_name}"
  15. engine = create_engine(
  16. sqlite_url,
  17. echo=False,
  18. connect_args={"check_same_thread": False},
  19. pool_size=20, # 增加基础连接池大小
  20. max_overflow=30, # 增加最大溢出连接数
  21. pool_timeout=60, # 保持合理的超时时间
  22. pool_recycle=1800, # 连接回收时间(秒)
  23. pool_pre_ping=True, # 检查连接有效性
  24. )
  25. # 创建表
  26. def create_all_database():
  27. SQLModel.metadata.create_all(engine)
  28. # 创建会话
  29. def __get_session():
  30. with Session(engine) as session:
  31. try:
  32. yield session
  33. finally:
  34. session.close()
  35. # 创建一个通用的 CRUD 类
  36. class CRUD:
  37. def __init__(self, model):
  38. self.model = model
  39. def create(self, session: Session, obj_in):
  40. obj_in_data = dict(obj_in)
  41. db_obj = self.model(**obj_in_data)
  42. session.add(db_obj)
  43. session.commit()
  44. session.refresh(db_obj)
  45. return db_obj
  46. def truncate(self, session: Session):
  47. """
  48. 使用SQL删除语句清空所有记录(更高效)
  49. :param session: 数据库会话
  50. """
  51. stmt = delete(self.model)
  52. result = session.exec(stmt)
  53. session.commit()
  54. return result.rowcount
  55. def read(
  56. self,
  57. session: Session,
  58. conditions: Optional[Dict] = None,
  59. order_by: Optional[str] = None,
  60. ascending: bool = True,
  61. ):
  62. query = select(self.model)
  63. if conditions:
  64. query = query.where(
  65. and_(
  66. *(
  67. getattr(self.model, key) == value
  68. for key, value in conditions.items()
  69. )
  70. )
  71. )
  72. if order_by:
  73. if ascending:
  74. query = query.order_by(asc(getattr(self.model, order_by)))
  75. else:
  76. query = query.order_by(desc(getattr(self.model, order_by)))
  77. data = session.exec(query).first()
  78. return data
  79. def read_all(
  80. self,
  81. session: Session,
  82. conditions: Optional[Dict] = None,
  83. order_by: Optional[str] = None,
  84. ascending: bool = True,
  85. join_conditions: Optional[list] = None, # 新增:支持多个JOIN
  86. ):
  87. query = select(self.model)
  88. # 处理JOIN逻辑
  89. if join_conditions:
  90. for join_info in join_conditions:
  91. joined_model = join_info.get("model")
  92. on_clause = join_info.get("on")
  93. is_outer = join_info.get("is_outer", False)
  94. if not joined_model or not on_clause:
  95. continue
  96. if is_outer:
  97. query = query.outerjoin(joined_model, on_clause)
  98. else:
  99. query = query.join(joined_model, on_clause)
  100. if conditions:
  101. for key, value in conditions.items():
  102. column = getattr(self.model, key)
  103. if isinstance(value, list):
  104. # 如果值是列表,使用 IN 查询
  105. query = query.where(column.in_(value))
  106. else:
  107. # 否则使用等于条件
  108. query = query.where(column == value)
  109. if order_by:
  110. if ascending:
  111. query = query.order_by(asc(getattr(self.model, order_by)))
  112. else:
  113. query = query.order_by(desc(getattr(self.model, order_by)))
  114. data = session.exec(query).all()
  115. return data
  116. def update(self, session: Session, obj_id: int, **kwargs):
  117. db_obj = session.get(self.model, obj_id)
  118. for key, value in kwargs.items():
  119. setattr(db_obj, key, value)
  120. session.commit()
  121. session.refresh(db_obj)
  122. return db_obj
  123. def deleteConditions(
  124. self,
  125. session: Session,
  126. conditions: Optional[Dict] = None,
  127. ):
  128. query = select(self.model)
  129. if conditions == None:
  130. return False
  131. query = query.where(
  132. and_(
  133. *(
  134. getattr(self.model, key) == value
  135. for key, value in conditions.items()
  136. )
  137. )
  138. )
  139. objects_to_delete = session.exec(query).all()
  140. for obj in objects_to_delete:
  141. session.delete(obj)
  142. session.commit()
  143. # session.refresh()
  144. return True
  145. def delete(self, session: Session, obj_id: int):
  146. db_obj = session.get(self.model, obj_id)
  147. session.delete(db_obj)
  148. session.commit()
  149. # session.refresh()
  150. # 恢复 updateConditions 方法
  151. def updateConditions(self, session: Session, conditions: Dict, **kwargs):
  152. """
  153. 根据条件更新记录
  154. :param session: 数据库会话
  155. :param conditions: 更新条件字典
  156. :param kwargs: 需要更新的字段和值
  157. :return: 更新后的对象
  158. """
  159. query = select(self.model).where(
  160. and_(
  161. *(
  162. getattr(self.model, key) == value
  163. for key, value in conditions.items()
  164. )
  165. )
  166. )
  167. print("SQL 打印==>",str(query))
  168. result = session.exec(query).first()
  169. if result:
  170. for key, value in kwargs.items():
  171. setattr(result, key, value)
  172. session.commit() # 提交事务以保存更改
  173. return result
  174. return None
  175. def updateConditionsAll(self, session: Session, conditions: Dict, **kwargs):
  176. """
  177. 根据条件更新记录
  178. :param session: 数据库会话
  179. :param conditions: 更新条件字典
  180. :param kwargs: 需要更新的字段和值
  181. :return: 更新后的对象
  182. """
  183. query = select(self.model).where(
  184. and_(
  185. *(
  186. getattr(self.model, key) == value
  187. for key, value in conditions.items()
  188. )
  189. )
  190. )
  191. print("SQL 打印==>", str(query))
  192. results = session.exec(query).fetchall()
  193. if results:
  194. for obj in results: # 遍历每个对象
  195. for key, value in kwargs.items():
  196. setattr(obj, key, value) # 对每个对象设置属性
  197. session.commit() # 提交事务以保存更改
  198. return results
  199. return None
  200. # 批量插入数据到设备配置表
  201. def batch_insert_device_configs(session: Session, action_tabs: list, data_list: list):
  202. """批量插入数据到设备配置表"""
  203. for idx, tab in enumerate(action_tabs):
  204. crud = CRUD(DeviceConfigTabs)
  205. device_tab = DeviceConfigTabs(
  206. mode_type=tab.get("mode_type"),
  207. mode_name=tab.get("mode_name"),
  208. )
  209. create_obj = crud.create(session, obj_in=device_tab)
  210. for data in data_list:
  211. data["tab_id"] = create_obj.id
  212. data["is_system"] = False
  213. if idx in [0, 6]:
  214. data["is_system"] = True
  215. device_config = DeviceConfig(**data)
  216. session.add(device_config)
  217. session.commit() # 合并事务提交
  218. def batch_insert_device_configsNew(
  219. session: Session, action_tabs: list, data_list: list
  220. ):
  221. """批量插入数据到设备配置表"""
  222. for idx, tab in enumerate(action_tabs):
  223. crud = CRUD(DeviceConfigTabs)
  224. device_tab = DeviceConfigTabs(
  225. id=tab.get("id"),
  226. mode_type=tab.get("mode_type"),
  227. mode_name=tab.get("mode_name"),
  228. )
  229. create_obj = crud.create(session, obj_in=device_tab)
  230. for data in data_list:
  231. # data["tab_id"] = create_obj.id
  232. # data["is_system"] = False
  233. # if idx in [0, 6]:
  234. # data["is_system"] = True
  235. device_config = DeviceConfig(**data)
  236. session.add(device_config)
  237. session.commit() # 合并事务提交
  238. # 批量插入系统配置
  239. def batch_insert_sys_configs(session: Session, data_list: list):
  240. """批量插入数据到设备配置表"""
  241. for data in data_list:
  242. print("data", data, type(data))
  243. config = SysConfigs(**data)
  244. session.add(config)
  245. session.commit() # 合并事务提交
  246. # 插入照片记录
  247. async def insert_photo_records(
  248. image_deal_mode: int, goods_art_no: str, image_index: int, action_id: int
  249. ):
  250. with SqlQuery() as session: # 使用上下文管理器复用会话
  251. """批量插入数据到照片记录"""
  252. data = {
  253. "image_deal_mode": image_deal_mode,
  254. "goods_art_no": goods_art_no,
  255. "image_index": image_index,
  256. "action_id": action_id,
  257. }
  258. device_config = PhotoRecord(**data)
  259. session.add(device_config)
  260. session.commit()
  261. session.refresh(device_config)
  262. record_id = device_config.id
  263. return True, record_id
  264. def SqlQuery():
  265. return next(__get_session())
  266. # 使用示例
  267. if __name__ == "__main__":
  268. pass
  269. # 使用 next 函数从生成器中获取 Session 对象
  270. # session = SqlQuery()
  271. # 创建 CRUD 实例
  272. # device_config_crud = CRUD(DeviceConfig)
  273. # 创建新记录
  274. # new_device_config = DeviceConfig(
  275. # mode_type="example_mode",
  276. # execution_type="example_execution",
  277. # action_name="example_action",
  278. # action_index=1,
  279. # picture_index=1,
  280. # camera_height=100,
  281. # camera_angle=45.5,
  282. # number_focus=2,
  283. # take_picture=True,
  284. # turntable_position=10.0,
  285. # turntable_angle=30.5,
  286. # shoe_upturn=False,
  287. # pre_delay=1.5,
  288. # after_delay=2.5,
  289. # led_switch=True,
  290. # is_wait=False,
  291. # )
  292. # created_device_config = device_config_crud.create(session, new_device_config)
  293. # print(f"Created Device Config: {created_device_config}")
  294. # 读取记录
  295. # read_device = device_config_crud.read(session, 1)
  296. # print(f"Read Device Config: {read_device.model_dump()}")
  297. # 读取所有记录
  298. # all_devices = device_config_crud.read_all(session, conditions={"id": 2})
  299. # print(f"All Device Configs: {[device.model_dump() for device in all_devices]}")
  300. # # 更新记录
  301. # updated_device = device_config_crud.update(
  302. # session, created_device_config.id, mode_type="updated_mode"
  303. # )
  304. # print(f"Updated Device Config: {updated_device}")
  305. # # 删除记录
  306. # device_config_crud.delete(session, created_device_config.id)
  307. # print("Device Config deleted.")