代码之家  ›  专栏  ›  技术社区  ›  Timothy Wong

哪个更好-execute(insert)或executemany(insert)

  •  1
  • Timothy Wong  · 技术社区  · 6 年前

    情况:需要在sqlite数据库中插入大量数据。

    问题:我们可以使用两个语句插入数据-

    data = [("111", "222", "333"), ("AAA", "BBB", "CCC"), ("XXX", "YYY", "ZZZ")]
    
    #method1
    for item in data:
        cursor.execute("INSERT INTO table(value1, value2, value3) VALUES (?,?,?)", item)
        conn.commit()
    
    #method2
    cursor.execute("INSERT INTO table(value1, value2, value3) VALUES(?,?,?)", data)
    conn.commit()
    

    问题:如果忽略速度,从编程的角度来看,哪一个是更好的实践?如果可能的话,解释一下原因。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Amadan    6 年前

    从纯粹的编程实践来看,除了速度,没有区别。然而。。。

    准备好的陈述很好。但是,mass insert生成大量变量绑定,而sqlite有 upper limit 它可以处理的主机参数的数量,默认为999。

    因此,multi-insert很适合玩弄,但对于实际数据,您将使用循环。不过,我可以提供的一个好建议是,您将希望在事务中包装循环,因为如果没有它,afaik,每个插入都将是一个自动事务,这将极大地影响时间。(另外,在循环结束时提交,而不是在循环内提交。)

    编辑:根据python文档,

    默认情况下,sqlite3模块在数据修改语言(DML)语句(即 INSERT / UPDATE / DELETE / REPLACE ,并在非DML、非查询语句(即除 SELECT 或上述)。

    所以你在方法1中的代码[ BEGIN ]我是说, 插入 ,请 COMMIT ,,[ 开始 ]我是说, 插入 ,请 提交 …具有 开始 由python隐式发送以启动事务,并且 提交 明确地结束它。如果您这样构造代码:

    for item in data:
        cursor.execute("INSERT INTO table(value1, value2, value3) VALUES (?,?,?)", item)
    conn.commit()
    

    那么你有一个隐含的 开始 一开始,很多 INSERTS 还有一个明确的 提交 最后。这会使你的代码加速10-20倍左右。