riku
2024-01-10 a9e8e27e0503552b7b2a99c821da732175d4f071
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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)