python - 如何使用Python有效地将CSV文件数据插入到MYSQL中?

标签 python mysql python-3.x database

我有一个带有 aprox 的 CSV 输入文件。 400万条记录。 插入从 +2 小时开始运行,但仍未完成。 数据库仍然是空的。

关于如何实际插入值(使用 insert into)和更快的任何建议,比如将插入分成 block ?

我是 python 的新手。

  • csv 文件示例
43293,cancelled,1,0.0,
1049007,cancelled,1,0.0,
438255,live,1,0.0,classA
1007255,xpto,1,0.0,
  • python 脚本
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='"')
            for row in csv_data:
                insert_str = "INSERT INTO table_x (ID, desc, desc_version, val, class) VALUES (%s, %s, %s, %s, %s)"
                cur.execute(insert_str, row)
        conn.commit()
    finally:
        conn.close()

更新: 感谢所有的投入。 正如建议的那样,我尝试了一个计数器来批量插入 100 个和一个较小的 csv 数据集(1000 行)。 现在的问题是只插入了 100 条记录,尽管计数器多次通过 10 x 100。

代码更改:

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()
   count = 0
   try:
       with open(xing_csv_input, newline='') as csvfile:
           csv_data = csv.reader(csvfile, delimiter=',', quotechar='"')
           for row in csv_data:
               count += 1
               print(count)
               insert_str = "INSERT INTO table_x (ID, desc, desc_version, val, class) VALUES (%s, %s, %s, %s, %s)"

               if count >= 100:
                  cur.execute(insert_str, row)
                  print("count100")
                  conn.commit()
                  count = 0

               if not row:
                  cur.execute(insert_str, row)
                  conn.commit()
   finally:
       conn.close()

最佳答案

有很多方法可以优化这个插入。以下是一些想法:

  1. 你有一个遍历整个数据集的 for 循环。您可以每 100 次左右执行一次 commit()
  2. 你可以insert many rows into one insert
  3. 您可以将两者结合起来,在您的 CSV 中每 100 行进行一次多行插入
  4. 如果 python 不是必需的,您可以按照说明直接使用 MySQL 来完成 here . (如果您必须使用 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()

关于python - 如何使用Python有效地将CSV文件数据插入到MYSQL中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56629884/

相关文章:

mysql - 服务器时区值 'CEST' 无法识别

mysql - 使用 vagrant 提供简单的 mysql 设置(使用 shell provisioner)

ubuntu 18.04 LTS/usr/lib/fresh install 中的 python 目录

python - 使用 Pyspark 进行单元测试 : unclosed socket warnings

python importlib 没有命名的模块

python - 在 Linux 中使用 Python 快捷方式

mysql - 在 mysql SELECT 中更改日期格式的最佳方法?

python - 列出当前目录的上次创建日期

python - 在断言更改之前等待 CSS 属性更改

python - 无法运行 Enthought python