【问题标题】:Insert multiple rows using execute使用执行插入多行
【发布时间】:2018-02-22 21:18:10
【问题描述】:

我希望执行以下语句:

c.execute('INSERT INTO artists (name, score) VALUES("Buddy Rich", 10), ("Candido", 9), ("Charlie Byrd", 8);')

但我没有像上面那样硬编码这些值,而是将它们放在一个变量中:

scores = (("Buddy Rich", 10), ("Candido", 9), ("Charlie Byrd", 8))

如何将scoresexecute() 一起使用,其中scores 可以包含任意数量的值?

更新

我希望能够保证,如果数据被插入到表中,即使出现程序崩溃,也能插入所有数据,或者不插入任何数据。如果在运行executemany 时出现程序崩溃,是否存在仅添加部分行的风险?

例如,这是否会导致仅添加一些行:

try:
   c.executemany('INSERT INTO artists (name, score) VALUES (?, ?)', scores)
except:
   c.commit() 

【问题讨论】:

  • 但是您仍然对它们进行了硬编码。 c.executemany('INSERT INTO artists (name, score) VALUES (?, ?)', scores)
  • @roganjosh 这只是简单地执行多次插入(在 for 循环中执行)还是最近引入 sqlite 的“多次插入”?
  • 您能否将我链接到您所指的内容?
  • 您可以并且应该使用 python 中的 executemany,只需将其包装在事务中即可。另一种选择是将数据从 csv 加载到表中:stackoverflow.com/questions/14947916/import-csv-to-sqlite

标签: python sqlite


【解决方案1】:

要将事物放入事务中,您应该使用游标,以及在引发异常时回滚的 try 块。

import sqlite3   
scores = (("Buddy Rich", 10), ("Candido", 9), ("Charlie Byrd", 8))
con = sqlite3.connect(':memory:')
try:
    cur = c.cursor()
    cur.execute('create table artists (name text primary key, score int)')
    cur.executemany('INSERT INTO artists (name, score) VALUES (?, ?)', scores)
    con.commit()
except:
    con.rollback()

【讨论】:

    【解决方案2】:

    你可以使用executemany:

    scores = (("Buddy Rich", 10), ("Candido", 9), ("Charlie Byrd", 8))
    c.executemany('INSERT INTO artists (name, score) VALUES (?, ?)', scores)
    

    【讨论】:

    • 如果在运行 executemany 时出现程序崩溃,是否存在仅添加部分行的风险?在这方面,在我的程序中捕获异常(如 KeyboardInterrupt)并执行提交对我来说是否安全,或者我是否冒着仅添加一些行的风险?
    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多