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)
'''