Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como inserir dados de um arquivo CSV no MYSQL usando o Python de forma eficiente?


Há muitas maneiras de otimizar esta inserção. Aqui estão algumas ideias:
  1. Você tem um loop for em todo o conjunto de dados. Você pode fazer um commit() a cada 100 ou mais
  2. Você pode inserir muitas linhas em uma inserção
  3. você pode combinar os dois e fazer uma inserção de várias linhas a cada 100 linhas em seu CSV
  4. Se o python não for um requisito, você pode fazê-lo diretamente usando o MySQL, conforme explicado aqui . (Se você precisar fazer isso usando python, ainda poderá preparar essa instrução em python e evitar fazer loops no arquivo manualmente).

Exemplos:

para o número 2 da lista, o código terá a seguinte estrutura:
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()