从另一个游标对象向SQLite数据库插入Python变量

0 投票
2 回答
1722 浏览
提问于 2025-04-15 16:47

这里用一个来自Python文档的例子:

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 个回答

1

元组是不可改变的,但你可以很容易地提取它们的内容,然后形成新的元组。而且,我不太确定,但我觉得执行(execute())这个调用并不一定非得用元组。任何序列,比如列表,也可以用吗?

总之,你需要的是:

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

这段代码会把一个包含一个元素的元组添加到现有的元组中,从而形成一个新的六个元素的元组。

0

我猜你是想在 executemany 版本中用 stocks 而不是 t

对于 executemany 版本,你还可以这样做:

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

使用生成器表达式而不是列表推导式,可以避免创建一个全新的数据结构。如果你的输入很多,这一点非常重要。

撰写回答