【问题标题】:insert multi values from python list into sqlite table将python列表中的多个值插入sqlite表
【发布时间】: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


【解决方案1】:

查看sqlite3.Cursor.executemany() 的文档。

purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
             ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
             ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
            ]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)

【讨论】:

  • 太棒了!谢谢你的帮助。
【解决方案2】:

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)

【讨论】:

  • 对不起,错误发生在sqlite3.OperationalError: no such column: ST0001
猜你喜欢
  • 2020-02-20
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
相关资源
最近更新 更多