3

次のようなCSVファイルをロードしたいと思います。

Acct. No.,1-15 Days,16-30 Days,31-60 Days,61-90 Days,91-120 Days,Beyond 120 Days
2314134101,898.89,8372.16,5584.23,7744.41,9846.54,2896.25
2414134128,5457.61,7488.26,9594.02,6234.78,273.7,2356.13
2513918869,2059.59,7578.59,9395.51,7159.15,5827.48,3041.62
1687950783,4846.85,8364.22,9892.55,7213.45,8815.33,7603.4
2764856043,5250.11,9946.49,8042.03,6058.64,9194.78,8296.2
2865446086,596.22,7670.04,8564.08,3263.85,9662.46,7027.22
,4725.99,1336.24,9356.03,1572.81,4942.11,6088.94
,8248.47,956.81,8713.06,2589.14,5316.68,1543.67
,538.22,1473.91,3292.09,6843.89,2687.07,9808.05
,9885.85,2730.72,6876,8024.47,1196.87,1655.29

ただし、気付いた場合は、一部のフィールドが不完全です。MySQLは最初の列が欠落している行をスキップするだけだと思います。コマンドを実行すると:

LOAD DATA LOCAL INFILE 'test-long.csv' REPLACE INTO TABLE accounts
    FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES
    (cf_535, cf_580, cf_568, cf_569, cf_571, cf_572);

そして、MySQLの出力は次のとおりです。

Query OK, 41898 rows affected, 20948 warnings (0.78 sec)
Records: 20949  Deleted: 20949  Skipped: 0  Warnings: 20948

行数はわずか20,949ですが、MySQLは41,898行が影響を受けていると報告しています。なぜそうなのか?また、テーブルでは実際には何も変更されていません。また、生成された警告が何であるかを確認できませんでした。LOAD DATA INFILEを使用したかったのは、Pythonが各行を更新するのに0.5秒かかるため、20,000以上のレコードを持つファイルの場合は2.77時間に相当します。

更新:自動コミットを「False」に設定するようにコードを変更し、db.commit()ステートメントを追加しました。

# Tell MySQLdb to turn off auto-commit
db.autocommit(False) 

# Set count to 1
count = 1
while count < len(contents):
    if contents[count][0] != '':
        cursor.execute("""
            UPDATE accounts SET cf_580 = %s, cf_568 = %s, cf_569 = %s, cf_571 = %s, cf_572 = %s
            WHERE cf_535 = %s""" % (contents[count][1], contents[count][2], contents[count][3], contents[count][4], contents[count][5], contents[count][0]))
    count += 1

try:
    db.commit()
except:
    db.rollback()
4

2 に答える 2

2

ここには基本的に3つの問題があります。逆順で

  1. 個々のステートメントで Python の挿入を行っていますか? それらすべてを begin transaction/commit で囲みたいと思うでしょう。20,000 件のコミットには何時間もかかります。
  2. import ステートメントでは 6 つのフィールドが定義されていますが、CSV には 7 つのフィールドがあります。それは二重の行数を説明するでしょう: 入力のすべての行はデータベースの 2 つの行になり、2 番目の行はフィールド 2-6 が null になります。
  3. 不完全な行は、欠落している列の null またはデフォルト値で挿入されます。これは、これらの不正な行で必要なものではない場合があります。

Python プログラムが単一のトランザクションでも十分な速度で実行できない場合は、インポートする前に、少なくとも Python プログラムでデータ ファイルを編集/クリーンアップする必要があります。アカウントの場合。No. は主キーです。妥当なように、空白の行を挿入すると、インポート全体が失敗するか、自動番号がオンになっている場合は、偽のデータがインポートされます。

于 2009-08-06T04:50:37.313 に答える
0

LOAD DATA で REPLACE キーワードを使用する場合、「Deleted:」の後の数字は、実際に置き換えられた行数を示します。

于 2009-08-25T06:33:03.823 に答える