統計系列の一括挿入における位置決めエラー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.コード動的リンクデータベース:
4.実行結果:文字タイプのデータx,*,cが印刷され、数値タイプがデータベースに挿入されます.
5.新たに何かを追加すると、このように挿入する時間の複雑さにはO(log 2 n)が要求されるが、再帰に適用するとその空間の複雑さが大きくなり、データ量が大きすぎてデータエラーがある場合に再帰が限界を超えてしまう場合がある.この場合、再帰の深さは自分で定義することができる.
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)