Python + MySQL - 批量插入

Mik*_*ike 21 python mysql

我正在使用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解析器过载.

  • 从1.2.0开始,默认情况下,MySQLdb根据DB-API标准(PEP-249)的要求禁用自动提交.来源:http://mysql-python.sourceforge.net/FAQ.html (5认同)

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说法设置它.)

  • 我不知道这一点,因为我不使用MYISAM,但如果是这样,你可以通过从mysql shell执行这行`SET autocommit = 0;`来关闭提交(或者从你的内部执行此操作) python程序使用`cur.execute('SET autocommit = 0'); con.commit()`) (2认同)