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

背景:在我们使用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)

 

你可能感兴趣的:(算法,sql,python,python,递归,sql,折半插入)