我正在使用Python中的MySQLdb模块与数据库进行交互.我有一个情况,有一个非常大的列表(成千上万的元素),我需要作为行插入表中.
我现在的解决方案是生成一个大型INSERT语句作为字符串并执行它.
有更聪明的方法吗?
msw*_*msw 17
有一种更聪明的方式.
批量插入的问题是默认情况下启用自动提交,从而导致insert在下一个插入可以启动之前将每个语句保存到稳定存储.
如手册页注释:
默认情况下,MySQL在启用自动提交模式的情况下运行.这意味着只要执行更新(修改)表的语句,MySQL就会将更新存储在磁盘上以使其永久化.要禁用自动提交模式,请使用以下语句:
SET autocommit=0;
Run Code Online (Sandbox Code Playgroud)
通过将autocommit变量设置为零来禁用自动提交模式后,对事务安全表(例如InnoDB,BDB或NDBCLUSTER的表)的更改不会立即成为永久更改.必须使用COMMIT将更改存储到磁盘或ROLLBACK以忽略更改.
这是RDBMs系统的一个非常常见的特性,它假设数据库完整性至关重要.它确实使批量插入每个插入大约1s而不是1ms.制作一个过大的插入语句的替代方法试图实现此单一提交,从而有可能使SQL解析器过载.
Pus*_*ade 13
如果您必须插入非常大量的数据,为什么要尝试将所有数据插入一个insert?(insert在执行此大字符串时,这将不必要地将内存加载到内存中.如果要插入的数据非常大,这也不是一个很好的解决方案.)
为什么不在insertdb中为每个命令放置一行并使用a放置所有行for...loop并最终提交所有更改?
con = mysqldb.connect(
host="localhost",
user="user",
passwd="**",
db="db name"
)
cur = con.cursor()
for data in your_data_list:
cur.execute("data you want to insert: %s" %data)
con.commit()
con.close()
Run Code Online (Sandbox Code Playgroud)
(相信我,这真的很快,但如果你的结果变慢,那就意味着你autocommit必须这样做True.False按照msw说法设置它.)