跳到主要内容

删除历史数据

法规约束

数据删除是高敏感操作, 多数行业法规 (GMP / FDA / ISO) 要求"永不删除"或"删除必须留审计". 服务端实现可能加额外保护.

delete_history_range

删除时间区间内全部数据点.

def delete_history_range(self,
node_id: str,
start_utc: datetime,
end_utc: datetime,
delete_modified_too: bool = False) -> StatusCode: ...
参数说明
node_id目标历史节点 NodeId
start_utc起始时间 (UTC, 包含)
end_utc结束时间 (UTC, 包含)
delete_modified_tooTrue = 同时删修改记录; False = 只删原始, 保留修改记录
import datetime as dt

now = dt.datetime.now(dt.timezone.utc)
st = ua.delete_history_range(
"ns=2;s=Temperature",
start_utc=now - dt.timedelta(days=30),
end_utc=now - dt.timedelta(days=7))
print(st.name)

删除特定时间点 (走 update_history)

OPC UA 把"按时间点删除"作为 HistoryUpdate 的一种 (HistoryUpdateType.REMOVE):

from darra_opcua import HistoryUpdateType

# REMOVE 模式: values 列表里每个 DataValue 的 source_timestamp 决定删除哪些点
results = ua.update_history("ns=2;s=Temperature", HistoryUpdateType.REMOVE, dv_list)

详见 update_history.


删除事件 (待后续版本暴露)

OPC UA 还有 delete_history_events(node_id, event_ids) 服务, 按 EventId 列表删事件历史. 当前 SDK 待后续版本提供.


法规约束

  • 永不删除 (只允许标记 obsolete)
  • 删除必须留审计 (谁删的, 何时, 原因)

服务端实现可能加额外保护. 客户端可能拿到 BadUserAccessDenied.

性能

  • 大区间 delete 服务端可能阻塞数秒到数分钟 (重建索引)
  • 长时间操作建议放后台线程, 避免 UI 卡死
import threading

def do_delete():
ua.delete_history_range("ns=2;s=Temperature", start, end)

threading.Thread(target=do_delete, daemon=True).start()

下一步