2017-06-26 2 views
0

.xlsxファイルからSQLデータベースにデータをインポートしようとしています。 は今、私はデータベース .xlsxファイルをMySQLデータベースにロードする最速の方法

  • への接続を確立

    • にopenpyxlとのMySQLdbモジュールを使用するPythonスクリプトを持って
    • ブックを開く行スルーワークシート
    • ループをつかみますワークシート、必要な列を抽出する 各レコードを1つずつデータベースに挿入する

    残念ながら、これは非常に遅いです。私は巨大なデータセットを扱っているので、これを行うためのより速い方法を見つける必要があります(できればPythonで)。何か案は?

    wb = openpyxl.load_workbook(filename="file", read_only=True) 
    ws = wb['My Worksheet'] 
    
    conn = MySQLdb.connect() 
    cursor = conn.cursor() 
    
    cursor.execute("SET autocommit = 0") 
    
    for row in ws.iter_rows(row_offset=1): 
        sql_row = # data i need 
        cursor.execute("INSERT sql_row") 
    
    conn.commit() 
    
  • +3

    現在のコードのスニペットを含めることはできますか?どのバージョンのSQLを使用していますか?解決策は、現状で何をしているかに応じて、SQLで自動コミットをオフにするか、DBに行を入力する正確な方法を変更する可能性があります。 –

    答えて

    0

    オンの場合は自動コミットを無効にしてください。自動コミットは、MySQLがすぐにデータをディスクにプッシュしようとする機能です。これは、挿入物が1つしかない場合に便利ですが、個々の挿入物に長時間かかることがあります。代わりに、それをオフにして、一度にすべてのデータを挿入し、すべての挿入ステートメントを実行した後でコミットすることができます。

    このような何かがうまくいくかもしれない:

    con = mysqldb.connect(
            host="your db host", 
            user="your username", 
            passwd="your password", 
            db="your db name" 
           ) 
    con.execute("SET autocommit = 0") 
    cursor = con.cursor() 
    data = # some code to get data from excel 
    for datum in data: 
        cursor.execute("your insert statement".format(datum)) 
    
    con.commit() 
    con.close() 
    
    +0

    ありがとうございました。挿入は少し速いですが、まだ完了までに数分かかります(私のデータセットには200000以上の行があります)。その他の提案はありますか? – Brinley

    +0

    オリジナルの投稿でコードを喜ばせることはできますか?これは私の最高の推測でしたが、あなたのコードを見ればもっと明白なことがあります! –

    +0

    上記を参照。 – Brinley

    0

    は、MySQLのLOAD DATA INFILEを使用し、CSVとしてブックのワークシートを保存することを検討してください。これはしばしば非常に高速です。

    sql = """LOAD DATA INFILE '/path/to/data.csv' 
         INTO TABLE myTable 
         FIELDS TERMINATED BY ',' 
         OPTIONALLY ENCLOSED BY '\"' 
         LINES TERMINATED BY '\n'""" 
    
    cursor.execute(sql) 
    con.commit() 
    
    関連する問題