我有一个带有 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()
最佳答案
有很多方法可以优化这个插入。以下是一些想法:
- 你有一个遍历整个数据集的 for 循环。您可以每 100 次左右执行一次
commit()
- 你可以insert many rows into one insert
- 您可以将两者结合起来,在您的 CSV 中每 100 行进行一次多行插入
- 如果 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/