Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment insérer efficacement les données d'un fichier CSV dans MYSQL en utilisant Python ?

Il existe de nombreuses façons d'optimiser cet insert. Voici quelques idées :

  1. Vous avez une boucle for sur tout l'ensemble de données. Vous pouvez faire un commit() tous les 100 environ
  2. Vous pouvez insérer plusieurs lignes dans une insertion
  3. vous pouvez combiner les deux et créer une insertion multiligne toutes les 100 lignes sur votre CSV
  4. Si python n'est pas une exigence, vous pouvez le faire directement en utilisant MySQL comme expliqué ici . (Si vous devez le faire en utilisant python, vous pouvez toujours préparer cette instruction en python et éviter de parcourir manuellement le fichier).

Exemples :

pour le numéro 2 de la liste, le code aura la structure suivante :

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()