python在mysql中插入60k行的最佳方法

时间:2014-01-23 03:34:23

标签: python mysql

我正在尝试在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);

1 个答案:

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