sql >> データベース >  >> RDS >> Mysql

Pythonを使用してCSVファイルデータをMYSQLに効率的に挿入するにはどうすればよいですか?

    この挿入を最適化する方法はたくさんあります。ここにいくつかのアイデアがあります:

    1. データセット全体にforループがあります。 commit()を実行できます 100程度ごと
    2. 多くの行を1つの挿入に挿入 できます
    3. 2つを組み合わせて、CSVの100行ごとに複数行の挿入を行うことができます
    4. Pythonが必須でない場合は、こちら 。 (Pythonを使用して実行する必要がある場合でも、Pythonでそのステートメントを準備し、ファイルを手動でループすることを回避できます)。

    例:

    リストの2番目の場合、コードは次の構造になります。

    def csv_to_DB(xing_csv_input, db_opts):
        print("Inserting csv file {} to database {}".format(xing_csv_input, db_opts['host']))
        conn = pymysql.connect(**db_opts)
        cur = conn.cursor()
        try:
            with open(xing_csv_input, newline='') as csvfile:
                csv_data = csv.reader(csvfile, delimiter=',', quotechar='"')
                to_insert = []
                insert_str = "INSERT INTO table_x (ID, desc, desc_version, val, class) VALUES "
                template = '(%s, %s, %s, %s, %s)'
                count = 0
                for row in csv_data:
                    count += 1
                    to_insert.append(tuple(row))
                    if count % 100 == 0:
                        query = insert_str + '\n'.join([template % r for r in to_insert])
                        cur.execute(query)
                        to_insert = []
                        conn.commit()
                query = insert_str + '\n'.join(template % to_insert)
                cur.execute(query)
                conn.commit()
        finally:
            conn.close()
    


    1. Mysqlはいくつかの列を1つの行に変換します

    2. Railsのテーブルにどのインデックスを追加するか

    3. mysqlインジェクションの損害賠償?

    4. POSTの生データをログに記録するPHPスクリプト