在进行大量数据插入MySQL中时,使用excute的效率非常低,所以将列表数据插入数据库中可以使用excutemany()。
关于excute和excutemany的执行效率可以参考以下博客:
Python使用pymysql模块的executemany()方法批量插入数据 提高Mysql数据库写入效率
再此介绍以下excutemany()
方法:
executemany(query,args):能同时执行多条语句,强烈建议执行多条语句时使用executemany()。
- query:sql语句
例如: ‘INSERT INTO TABLE(id,language) values(%s,%s)’ - args:模板字符串的参数,是一个列表,列表中的每一个元素必须是元组!!!
例如:[(1,‘Java’),(2,‘Python’),(3,‘Golang’),(4,‘C’),(5,‘C++’)]
如果是嵌套列表可以使用以下方法将列表数据转为元组数据
results = [[1, ‘Java’], [2, ‘Python’], [3, ‘GoLang’], [4, ‘C’], [5, ‘C++’]]
print(list(map(tuple, results)))
输出结果:
[(1, ‘Java’), (2, ‘Python’), (3, ‘GoLang’), (4, ‘C’), (5, ‘C++’)]
executemany()的使用
db = pymysql.connect(host='localhost', user='root', password='001314', database='flask')cursor = db.cursor()
sql = "insert into tablename(id,keywords) value(%s,%s)"
results = [(1,'Java'),(2,'Python'),(3,'GoLang'),(4,'C'),(5,'C++')]
try:cursor.executemany(sql,results)
except:db.rollback()print("插入失败", e)
finally:db.commit()cursor.close()db.close()
以上代码当执行executemany出现Duplicate entry异常时,插入失败。
如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:
INSERT IGNORE INTO TABLE(id,language) values(%s,%s)
这样当有重复记录就会忽略,执行后返回数字0