统计系列之批量插入中定位错误value

3 篇文章 0 订阅
2 篇文章 0 订阅

背景:在我们使用sql的时候会使用到批量插入(一条replace into/insert 语句后面接多条value值)大大减少了程序和数据库的交互给数据库减少了负担,但是批量插入会经常出现后面接的多个value值中某一条因数据类型或主键唯一等各种原因导致整个sql执行失败,而且由于value量太大无法找到到底哪一条value出现问题,后面就是解决这个问题的方法。

1.例子:建立测试数据库test1,包含测试字段int型test 

2.算法思想:利用折半插入的思想,将所有value存储为一个列表型数据,将列表以字符串形式拼入sql执行插入,如果出错,将列表划分两半,在分别递归调用函数,直至列表长度为1仍执行错误,此时列表中value即为错误value,其余正确value则成功插入。

3.代码   动态链接数据库

#此处为动态链接数据库,不了解的同学可看一下我上篇文章
cursor, conn = link_dynamic_DB('test1')
values = [('1'),('2'),('x'),('4'),('*'),('6'),('7'),('c')]
sql = '''replace into test1(test)values'''
#sql为不带values的sql语句,values为批量插入的数据列表
def position_error_sql_value(sql, values, cursor, conn):
    n = len(values)
    try:
        X_sql = sql + ','.join(values)
        cursor.execute(X_sql)
        conn.commit()
    except:
        if n == 1:
            print('sql error value %s'%values)
        else:
            value1 = values[:n/2]
            value2 = values[n/2:]
            # print('value1%s'%value1)
            # print('value2%s'%value2)
            #递归调用错误value定位函数
            position_error_sql_value(sql, value1, cursor, conn)
            position_error_sql_value(sql, value2, cursor, conn)

4.执行结果:打印出字符类型的数据x,*,c 且数字类型插入数据库。

5.新增一点东西,虽然这般插入的时间复杂度要求O(log2n),但是运用到了递归其空间复杂度就会变大,数据量过大而且存在数据错误的时候可能会存在递归超限的情况,这时候递归深度我们可以自己定义:

import sys
#递归深度限定为100000
sys.setrecursionlimit(100000)

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值