从另一个游标对象向SQLite数据库插入Python变量
这里用一个来自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))
使用生成器表达式而不是列表推导式,可以避免创建一个全新的数据结构。如果你的输入很多,这一点非常重要。