1

私がやろうとしているのは、cx_Oracle を使用して一連の行を挿入し、エラー (つまり、制約違反) がある場合は不良行をログに記録することです。

execute を使用してそれを行う方法の sudo コードを次に示しますが、これはあまり効率的ではないようです。

for row in rows:
    try:
        cursor.execute("sql", row)
    except InsertError:
        badRecordCSVFile.write(row)

私はドキュメントを読みましたが、最初はexecutemanyが探していたものであるように見えました。ただし、このスレッドを読んだ後、 executemany は失敗するまでクエリを処理するだけのように見えます(私が望むものではありません)。

だから私の質問は、行を挿入し、失敗した行をログに記録する最良の方法は何ですか?

4

1 に答える 1

1

挿入ステートメントにSQLパラメーターを使用している場合、これは十分に効率的です。ボトルネックは、Oracleとのネットワーク通信にあります。

SQLパラメータを使用することにより、Oracleはクエリプランを作成し、それをすべての挿入で再利用する機会が与えられます。

ただし、挿入が失敗したときにトランザクションをロールバックする場合は、を使用することもできます.executemany()

于 2013-02-13T17:53:47.150 に答える