Tim*_*ong 1 python sqlite pysqlite python-3.x
情况:需要在 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()
Run Code Online (Sandbox Code Playgroud)
问题:如果忽略速度,从编程的角度来看,哪种做法更好?如果可能,还要解释原因。
从纯粹的编程实践来看,除了速度之外,没有任何区别。然而...
准备好的陈述是好的。然而,mass-insert 会产生大量的变量绑定,而 SQLite对它可以处理的主机参数数量有一个上限,默认为 999。
因此,多插入很适合玩弄,但对于真实数据,您将使用循环。不过,我可以提供的一个好建议是,您需要将循环包装在一个事务中,因为如果没有它,AFAIK,每个插入都将是一个自动事务,这将极大地影响时间。(另外,在循环结束时提交,而不是在循环内。)
编辑:根据 Python 文档,
默认情况下,sqlite3的模块打开交易数据修改语言(DML)语句之前隐式(即
INSERT/UPDATE/DELETE/REPLACE),并提交交易隐含之前非DML,非查询语句(即其他比什么SELECT或前述)。
因此,#method1 中的代码正在执行 [ BEGIN], INSERT, COMMIT, [ BEGIN], INSERT, COMMIT...BEGIN由 Python 隐式发送以启动事务,并COMMIT显式结束它。如果你这样构造你的代码:
for item in data:
cursor.execute("INSERT INTO table(value1, value2, value3) VALUES (?,?,?)", item)
conn.commit()
Run Code Online (Sandbox Code Playgroud)
那么你BEGIN在开始时有一个隐INSERTS式COMMIT,在最后有很多和一个显式。这应该将您的代码速度提高 10-20 倍左右。
| 归档时间: |
|
| 查看次数: |
1706 次 |
| 最近记录: |