基于Python?从mysql表读取千万数据实践
场景:
有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_bar_record表读取1000w条唯一的waybill_no,然后作为INSERT SQL语句的一部分,填充到ts_order_waybill的waybill_no字段中
tl_waybill_bar_record
ts_order_waybill
另外tl_waybill_bar_record表waybill_no有部分重复
实现思路
思路1、利用MySql的LIMIT offset, length分页功能+ORDER BY primary_key按主键排序,循环读取数据,然后解析读取的数据,直到满足条件停止
result = test_platform_db.select_many_record(query)
......(后续处理)
注意:这里如果不适用ORDER BY语句,可能在不同分页取数据时,会取到重复的数据
问题
跑程序的时候,经常会突然"卡死",可能是Python 类库自身原因,也可能是数据库请求过于频繁,这样会导致获取的结果丢失,需要重头开始跑
解决方法:
关键代码
waybill_no_set = set() # 用于存储获取的waybill_no
# 读取上次获取的数据
line = file_handler.readline()
line = line.strip() # 去掉换行符
while line:
waybill_no_set.add(line)
line = line.strip()
# 初始最小主键值
count = len(waybill_no_set) # 初始化以读取的waybill_no总数
result = test_db.select_many_record(query)
if result[0] and result[1]:
for item in result[1]:
waybill_no = item[0]
if waybill_no not in waybill_no_set:
waybill_no_set.add(waybill_no)
min_seq_id = item[1]
count += 1
print(count)
print(min_seq_id) ?# 记录上次读取的"最后位置"
file_handler.write(waybill_no)
file_handler.flush()
①.0000000:
break
# 插入数据
for waybill_no in?waybill_no_set:
time.sleep(0.1)
count = count + 1
print(waybill_no)
以上就是土嘎嘎小编为大家整理的Python?基于Python从mysql表读取千万数据实践相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!