from decorator.singleton import singleton from db.db_conn import db_conn, commit_sql from db.models.tables import DustDataInfo, SiteLatestTime from .site_latest_time_rep import SiteLatestTimeRepository @singleton class SiteDataRepository(object): """站点监测数据相关数据库操作""" def __init__(self) -> None: self.slt_rep = SiteLatestTimeRepository() def _get_by_mn_code(self, d_list, mn_code): for item in d_list: if item.mn_code == mn_code: return item return None @commit_sql def save_site_info(self, session, data_map): """保存站点监测数据, 同时更新站点数据最新时刻表""" # 获取当前站点最新时刻表 latest_time_list = session.query(SiteLatestTime).all() for key in data_map.keys(): # 将爬取获取的数据转换为数据库表的格式 d_list = DustDataInfo.json_to_cls(data_map[key]) if len(d_list) == 0: continue # 根据最新时刻,更新数据最新时刻数据库表 new_info = d_list[-1] item = self._get_by_mn_code(latest_time_list, new_info.mn_code) if item == None: # 未找到记录,新增记录 item = SiteLatestTime(mn_code=new_info.mn_code, latest_time=new_info.lst) self.slt_rep.update_site_status(item, new_info.lst) session.add(item) else: # 找到记录,更新记录 self.slt_rep.update_site_status(item, new_info.lst) # 插入新监测数据 session.add_all(d_list)