我正在尝试在mysql中插入60k行,但这需要10分钟才能完成
for obj in parsed_objs:
key = 'randomstring'
mysqlc.execute("""
REPLACE INTO infos
(`key`, `value`)
VALUES
(%(key)s, %(value)s)
""", {'key':key, 'value':obj['val']})
mysqlc.connection.commit()
这是一个很好的方法吗?
当我运行commit()时,脚本运行单独的查询或合并所有?
也许一个好主意应该像这样构建一个独特的字符串?
insert into table my_table(col1, col2) VALUES (val1_1, val2_1), (val1_2, val2_2);
答案 0 :(得分:2)
如果可能的话,最好在SQL中使用LOAD DATA INFILE ...语句来批量加载数据。这将避免创建大量单独的查询来加载每一行数据。
在您发布的代码中,您将为要加载的每行数据生成一个查询。 commit()
只提交事务,包含自事务启动以来的所有查询。
如果您确实想在Python中执行此操作,可以尝试使用executemany
,如下所示:
db = MySQLdb.connect(host="your_host", user="your_user", passwd="your_password", db="your_database")
write_cursor = db.cursor()
write_list = []
for obj in parsed_objs:
key = 'randomstring'
write_list.append( (key,obj[key]) )
sql = "REPLACE INTO infos (`key`, `value`) VALUES (%s, %s)"
write_cursor.executemany(sql, write_list)
db.commit()