統計系列の一括挿入における位置決めエラーvalue


背景:sqlを使用する場合、一括挿入(1つのreplace into/insert文の後ろに複数のvalue値が接続されている)を使用すると、プログラムとデータベースのインタラクションが大幅に減少し、データベースに負担が減少しますが、一括挿入では、後続の複数のvalue値のいずれかがデータ型やプライマリ・キーが一意であるなど、sql全体の実行に失敗することがよくあります.そしてvalue量が大きすぎてどのvalueに問題があるのか見つからないので、後でこの問題を解決する方法です.
1.例:テストフィールドint型testを含むテストデータベースtest 1を作成する
2.アルゴリズム思想:折半挿入の思想を利用して、すべてのvalueを1つのリスト型データとして保存し、リストを文字列形式でsqlに綴じて挿入を実行し、エラーが発生した場合、リストを2つに分け、それぞれ再帰的に関数を呼び出し、リスト長が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(log 2 n)が要求されるが、再帰に適用するとその空間の複雑さが大きくなり、データ量が大きすぎてデータエラーがある場合に再帰が限界を超えてしまう場合がある.この場合、再帰の深さは自分で定義することができる.
import sys
#       100000
sys.setrecursionlimit(100000)