For Loop 或 executemany - Python 和 SQLite3
Posted
技术标签:
【中文标题】For Loop 或 executemany - Python 和 SQLite3【英文标题】:For Loop or executemany - Python and SQLite3 【发布时间】:2017-10-02 19:00:10 【问题描述】:我最近开始学习Python和SQL,有一个问题。
在 SQLite3 中使用 Python 我编写了以下代码:
# Use sqlite3 in the file
import sqlite3
# Create people.db if it doesn't exist or connect to it if it does exist
with sqlite3.connect("people.db") as connection:
c = connection.cursor()
# Create new table called people
c.execute("""CREATE TABLE IF NOT EXISTS people(firstname TEXT, lastname TEXT, age INT, occupation TEXT)""")
people_list = [
('Simon', 'Doe', 20, 'Python Master'),
('John', 'Doe', 50, 'Java Master'),
('Jane', 'Doe', 30, 'C++ Master'),
('Smelly', 'Doe', 2, 'Shower Master')
]
# Insert dummy data into the table
c.executemany("""INSERT INTO people(firstname, lastname, age, occupation) VALUES(?, ?, ?, ?)""", people_list)
我注意到我可以使用 for 循环而不是像这样的 executemany 来做同样的事情:
# Use sqlite3 in the file
import sqlite3
# Create people.db if it doesn't exist or connect to it if it does exist
with sqlite3.connect("people.db") as connection:
c = connection.cursor()
# Create new table called people
c.execute("""CREATE TABLE IF NOT EXISTS people(firstname TEXT, lastname TEXT, age INT, occupation TEXT)""")
people_list = [
('Simon', 'Doe', 20, 'Python Master'),
('John', 'Doe', 50, 'Java Master'),
('Jane', 'Doe', 30, 'C++ Master'),
('Smelly', 'Doe', 2, 'Shower Master')
]
# Insert dummy data into the table
for person in people_list:
c.execute("""INSERT INTO people(firstname, lastname, age, occupation) VALUES(?, ?, ?, ?)""", person)
我只是想知道哪个效率更高,使用频率更高?
【问题讨论】:
【参考方案1】:使用executemany
进行批量插入会更有效,并且随着记录数的增加,性能差异通常会很大。执行插入语句会产生很大的开销,如果一次插入一行,就会一遍又一遍地产生这种开销。
您应该更喜欢批量插入,只要这样做很简单。
在某些情况下,编写一次插入一行的算法可能要简单得多。例如,如果您一次从某处接收一项数据,则在获取数据时将其插入可能会更简单,而不是在保存大量数据时建立一个列表并进行一次插入。在这种情况下,您需要考虑性能和代码简单性之间的权衡。通常最好从简单的方法开始(一次插入一行),然后仅在发现性能不佳时才优化其他内容。
【讨论】:
dan1111,正如我所想,感谢您的详细回复,非常感谢!以上是关于For Loop 或 executemany - Python 和 SQLite3的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 executemany 将每个 Key 中的第一个值写入数据库
如何通过 executemany() 语句转换 pandas 数据框以进行插入?
使用 `executemany` 更新现有 SQLite3 数据库中的条目(使用 Python sqlite3)