【发布时间】:2021-07-18 05:12:14
【问题描述】:
我在 python 列表中有超过一万条数据,从列表中添加数据需要 300 多秒 sqlite 表。 我想知道如何同时添加多个数据或最快的方法。
list_example = [('ST0001', '2020-04-11', 23.0), ('ST0002', '2020-04-11', 20.0), ('ST0003', '2020-04-11', 75.0)]
第一个代码版本:
import sqlite3
def add_temp_stock_data(PART_NO, INVDATE, COST):
global conn
global c
conn = sqlite3.connect('PRODUCT_LIST.db')
c = conn.cursor()
c.execute("""CREATE TABLE IF NOT EXISTS PRODUCT_LIST (
PART_NO TEXT,
INVDATE TEXT,
COST REAL)
""",
)
with conn:
c.execute("""INSERT INTO PRODUCT_LIST (PART_NO, INVDATE, COST)
VALUES (?,?,?)""",
(PART_NO, INVDATE, COST,))
conn.commit()
for i in range(len(list_example)):
PART_NO = list_example[i][0]
INVDATE = list_example[i][1]
COST = list_example[i][2]
add_temp_stock_data(PART_NO, INVDATE, COST)
第二个代码版本:
def add_temp_stock_data(list_example):
global conn
global c
conn = sqlite3.connect('PRODUCT_LIST.db')
c = conn.cursor()
c.execute("""CREATE TABLE IF NOT EXISTS PRODUCT_LIST (
PART_NO TEXT,
INVDATE TEXT,
COST REAL)
""",
)
for i in range(len(list_example)):
PART_NO = list_example[i][0]
print(PART_NO)
INVDATE = list_example[i][1]
print(INVDATE)
COST = list_example[i][2]
print(COST)
with conn:
c.execute("""INSERT INTO PRODUCT_LIST (PART_NO, INVDATE, COST)
VALUES (?,?,?)""",
(PART_NO, INVDATE, COST,))
print(list_example)
conn.commit()
add_temp_stock_data(list_example)
【问题讨论】:
-
尝试在单个事务中一次放置多个插入语句。 medium.com/@JasonWyatt/…
-
只执行一次
CREATE TABLE查询,您需要将其移出add_temp_stock_data()。不要为每个查询创建新连接。只需创建一个连接并将其作为参数传递给add_temp_stock_data(),您需要处理连接过早关闭的情况。 -
@Marichyasana 我正在尝试做那件事,但我是 Python 初学者所以你的有用链接对我来说太难理解了。
-
@MichaelRuth 谢谢你,我确实听从了你的建议,它可以减少一半的时间!!。但我也需要在单个事务中插入多个数据以使其更快,如果您不介意请帮忙。 :)
-
@wallefan 的答案已经使用了一个事务,因为
execute()实际上在底层实现为executemany()。您可以通过阅读源代码来验证这一点,或者您可以信任这个 Python 特定的 sqlite 优化article。我在像你这样的数据上运行executemany(),在 100 毫秒内插入了 100,000 次。使用sqlite3.Connection.executemany代替sqlite.Cursor.executemany或许可以节省更多时间,但这里的代码没有太多改进空间。
标签: python database list sqlite