Python的pymysql中提供有cursor.execute()
实现数据的逐行插入,但是当数据量较大时,这种插入方法十分耗时。这时我们可以使用cursor.executemany()
函数来实现数据的批量插入。
executemany()用法
在数据库连接后,使用cursor.excutemany(sql, list)
执行批量插入,其中sql为数据库SQL语句,其中:
- sql中的变量可以写为%s
- list为要插入数据库的元组列表,其中的元组元素依次与SQL语句中的%s对应。
注意: List中数据类型必须为Tuple元组 eg. [(1, ‘John’, ‘Doe’), (2, ‘Jane’, ‘Smith’),……]
具体实现如下:
import pymysql# 连接数据库
conn = pymysql.connect(host='localhost', user='username', password='password', database='dbname')cursor = db.cursor()# 准备数据
data = [(1, 'John', 'Doe'),(2, 'Jane', 'Smith'),# 更多数据...
]# 生成插入语句
insert_sql = "INSERT INTO table_name (id, first_name, last_name) VALUES (%s, %s, %s)"# 执行批量插入
cursor.executemany(insert_sql, data)cursor.close()
conn.commit()
conn.close()
【注意】:这里如果插入的数据量非常非常大时,也可以使用MySQL自定义存储过程实现批量插入,具体可以参考博客: python使用pymysql批量插入数据库5000W条复杂的数据,如何用python脚本实现和用MySQL自定义存储过程实现
executemany()与ON DUPLICATE KEY UPDATE一起使用
当executemany与ON DUPLICATE KEY UPDATE一起使用
此时,不能在SQL语句中ON DUPLICATE KEY UPDATE后面的部分继续使用%s表示变量,而是使用value(columnName)
表示需要update的变量。
正确样例如下:
sql = '''INSERT INTO `test`(`id`, `random_value`) VALUES(%s, %s)ON DUPLICATE KEY UPDATE `random_value` = values(random_value)'''
参考资料
- Python使用pymysql模块的executemany()方法批量插入数据 提高Mysql数据库写入效率
- python使用pymysql批量插入数据库5000W条复杂的数据,如何用python脚本实现和用MySQL自定义存储过程实现