从另一个游标对象将python变量插入SQLITE DB

时间:2009-12-08 13:36:31

标签: python sqlite

使用Python DOC中的示例:

stocks = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]: 
for t in stocks
    c.execute('insert into stocks values (?,?,?,?,?)', t)

在我的代码中,上面的股票是从查询到另一个数据库生成的。

由于元组是不可变的,如何将其他值传递给游标执行语句(除了元组之外)。

下面的示例是否有更好的解决方案?:

stocks = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]: 
for t in stocks
    t = list(t)
    t.append('Some Arb Value')
    t = tuple(t)
    c.execute('insert into stocks values (?,?,?,?,?,?)', t)

你也可以这样做:

stocks = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]: 
for t in stocks
    c.execute('insert into stocks values (?,?,?,?,?,?)', (t[0],t[1],t[2],t[3],t[4],'some value')

然而,上述解决方案不适用于executemany方法,即

c.executemany('insert into stocks values (?,?,?,?,?,?)', t)

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

元组是不可变的,但您可以轻松地提取其内容并形成新的元组。另外,我不确定,但我不认为execute()调用绝对必须有一个元组。包括列表在内的任何序列都不能正常工作吗?

无论如何,这就是你需要的:

for t in stocks:
    c.execute('insert into stock values (?,?,?,?,?,?)', t + ('some value',))

它为现有元组添加了一个元素元组,形成了一个新的六元素元组。

答案 1 :(得分:0)

我假设你打算在stocks版本中使用t代替executemany 对于executemany版本,您也可以

c.executemany('insert into stocks (?,?,?,?,?,?)', (t + ('Arb value',) for t in stocks))

使用生成器表达式而不是列表推导将使您无法创建一个全新的数据结构,如果您有许多输入,则必不可少。