当前位置: 首页 > news >正文

从外部平台通过接口获取数据,初始全量同步 和 后续带版本管理的增量同步

✅ 总体思路分为三步:

第一步:第一次全量同步

全量拉取数据写入表(如 order_model 和 order_detail_model)。

每条记录加上 version 字段(默认为 1)。

记录首次同步时间(SyncSettingModel 记录)。

第二步:增量同步(每日)

每次增量拉取数据后,对比是否有变化:

场景动作
订单为新订单(本地不存在)插入新记录,version=1
订单存在,但内容发生变化插入新一条记录version+=1(历史保留)
订单存在,且内容完全一样跳过,不处理

第三步:查询时只查最新版本

添加字段:version 和 is_latest

每次有新版本时,将旧版本 is_latest=False,新记录 is_latest=True

查询业务数据时只加 is_latest=True 作为过滤条件

✅ 数据表设计建议

以 OrderModel 为例,加上版本控制字段:

class OrderModel(models.Model):order_id = models.CharField(primary_key=True)  # 格式:ECCANG123456order_code = models.CharField()...version = models.IntegerField(default=1)is_latest = models.BooleanField(default=True)update_time = models.DateTimeField()  # 数据实际更新时间sync_time = models.DateTimeField()    # 我们同步时间

✅ 增量同步代码逻辑(伪代码)

# 假设 fetched_data 是 ECCANG 返回的一条订单数据
fetched_order_id = ECCANG + fetched_data["order_id"]
fetched_json = json.dumps(fetched_data, ensure_ascii=False)# 查找本地是否存在
latest_local = OrderModel.objects.filter(order_id=fetched_order_id, is_latest=True).first()if latest_local is None:# 新订单:version=1,is_latest=Trueinsert_new_order(fetched_data, version=1, is_latest=True)
else:# 比较内容是否相同if is_same(fetched_data, latest_local):pass  # 不变,跳过else:# 标记旧版本为非最新latest_local.is_latest = Falselatest_local.save(update_fields=["is_latest"])# 插入新版本new_version = latest_local.version + 1insert_new_order(fetched_data, version=new_version, is_latest=True)

is_same() 可以使用关键字段进行哈希比较,或者字段级比较。

✅ 插入方法封装建议

def insert_new_order(data, version, is_latest):order = OrderModel(order_id=ECCANG + data["order_id"],order_code=data["order_code"],...version=version,is_latest=is_latest,update_time=convert_tr_to_non_native_datetime3(data.get("update_date")),sync_time=get_non_native_now())order.save()

✅ 查询数据时的注意点

所有业务查询都要限制:

OrderModel.objects.filter(is_latest=True)

相关文章:

  • 常见证书格式区别
  • SOC-ESP32S3部分:9-GPIO输入按键状态读取
  • 提示词工程框架——CO-STAR 框架实战
  • Unity 踩坑记录 UnityWebRequest.Delete(url) downloadHandler 空指针
  • [原理理解] 基于diffusion的超分任务时候遇到的CLIPTokenizer和CLIPTextModel
  • 通过vps命令行向dropbox上传文件
  • lua脚本实战—— Redis并发原子性陷阱
  • 文章记单词 | 第102篇(六级)
  • 深度剖析并发I/O模型select、poll、epoll与IOCP核心机制
  • ”故茗”茶文化网站
  • 【【嵌入式开发 Linux 常用命令系列 19 -- linux top 命令的交互使用介绍】
  • 谢飞机的Java面试奇遇:AIO、BIO、NIO与Netty深度解析
  • 【心海资源】【原创开发】TG,飞机,电报,协议号及直登号转API
  • RK常见系统属性设置/获取命令使用
  • 推进可解释人工智能迈向类人智能讨论总结分享
  • canal实现mysql数据同步
  • python web flask专题-Flask入门指南:从安装到核心功能详解
  • 人脸识别技术合规备案最新政策详解
  • NC IntellisysIQ QP、QPA和QPD QP3 Slave buried slave ON RS232 等通讯接口针脚定义
  • 多语种多场景的的分页详解
  • 最专业的企业营销型网站建设公司/关键词提取
  • 做网站学不需要做后台管理系统/深圳网站建设的公司
  • 网站建设第一品牌 网站设计/东莞做网站推广的公司
  • 删除wordpress所以评论/seo网络营销技术
  • 高明网站制作/深圳快速seo排名优化
  • 怎样查看网站制作公司/网络营销策划书应该怎么写