|
|
|
|
@ -270,13 +270,16 @@ def save_to_db(
|
|
|
|
|
df_futures: pd.DataFrame,
|
|
|
|
|
df_options: pd.DataFrame,
|
|
|
|
|
filename: str,
|
|
|
|
|
batch_existing_keys: set = None,
|
|
|
|
|
) -> dict:
|
|
|
|
|
"""
|
|
|
|
|
将解析后的交易记录保存到数据库(含逐条去重校验)
|
|
|
|
|
去重规则:同一交易日 + 同一品种 + 同一交易时间 + 同一价格 => 视为重复,跳过
|
|
|
|
|
:param batch_existing_keys: 批量导入时,已处理文件的去重键集合(用于文件间去重)
|
|
|
|
|
:return: {
|
|
|
|
|
"batch_id": str, "futures_count": int, "options_count": int, "trade_dates": str,
|
|
|
|
|
"futures_skipped": int, "options_skipped": int, "total_parsed": int
|
|
|
|
|
"futures_skipped": int, "options_skipped": int, "total_parsed": int,
|
|
|
|
|
"new_keys": set # 本次导入新增的去重键(用于批量导入时传递给下一个文件)
|
|
|
|
|
}
|
|
|
|
|
"""
|
|
|
|
|
_load_variety_name_map()
|
|
|
|
|
@ -309,8 +312,12 @@ def save_to_db(
|
|
|
|
|
|
|
|
|
|
# 批量加载已有记录的去重键
|
|
|
|
|
existing_keys = _load_existing_dedup_keys(db, all_dates)
|
|
|
|
|
# 合并批量导入时已处理文件的去重键
|
|
|
|
|
if batch_existing_keys:
|
|
|
|
|
existing_keys = existing_keys | batch_existing_keys
|
|
|
|
|
|
|
|
|
|
records = []
|
|
|
|
|
new_keys_in_batch = set() # 本次导入新增的去重键
|
|
|
|
|
skipped_details = [] # 记录被跳过的重复记录详情
|
|
|
|
|
|
|
|
|
|
# 处理期货记录
|
|
|
|
|
@ -341,10 +348,11 @@ def save_to_db(
|
|
|
|
|
})
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
# 记录前几条的去重键用于调试
|
|
|
|
|
# 记录前几笔期货去重键用于调试
|
|
|
|
|
if futures_parsed <= 3:
|
|
|
|
|
logger.info(f"[去重校验] 期货记录 #{futures_parsed}: raw_date={raw_date!r}, trade_date={trade_date!r}, variety={variety!r}, time={trade_time!r}, price={price!r} => key={dedup_key!r}")
|
|
|
|
|
|
|
|
|
|
new_keys_in_batch.add(dedup_key)
|
|
|
|
|
rec = TradeRecord(
|
|
|
|
|
trade_type='期货',
|
|
|
|
|
symbol=contract,
|
|
|
|
|
@ -394,6 +402,7 @@ def save_to_db(
|
|
|
|
|
|
|
|
|
|
# 期权盈亏来自权利金(带正负号:卖为正,买为负)
|
|
|
|
|
premium = safe_float(row.get('权利金'))
|
|
|
|
|
new_keys_in_batch.add(dedup_key)
|
|
|
|
|
rec = TradeRecord(
|
|
|
|
|
trade_type='期权',
|
|
|
|
|
symbol=contract,
|
|
|
|
|
@ -454,6 +463,7 @@ def save_to_db(
|
|
|
|
|
"futures_parsed": futures_parsed,
|
|
|
|
|
"options_parsed": options_parsed,
|
|
|
|
|
"skipped_details": skipped_details, # 被跳过的重复记录详情
|
|
|
|
|
"new_keys": new_keys_in_batch,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|