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)
|