在Pythons SQLite文档中,我们有以下关于如何将许多值放入SQL数据库的示例:
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)
但是,如果我有一个包含日期的列表,一个包含买/卖,一个包含股票代码,一个包含金额和一个价格,在插入之前如何以最佳方式组合它们?我已经尝试循环遍历每个列表并将它们逐个插入SQLite DB中,但这需要花费很多时间。
dates = ['2006-03-28', '2006-04-05', '2006-04-06']
flags = ['buy', 'buy', 'sell']
tickers = ['IBM', 'MSFT', 'IBM']
amount = [1000, 1000, 500]
price = [45.00, 72.00, 53.00]
这需要太长时间:
for i in range(0, len(dates)):
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', dates[i], flags[i], tickers[i], amount[i], price[i])
答案 0 :(得分:4)
您可以使用zip()
function来转置适合executemany()
的输入列表:
rows = zip(dates, flags, tickers, amount, price)
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', rows)
该函数将每个列表中的元素配对成一个新元组;每个第一个元素组成一个元组,每个第二个元素组合成一个元组等。
演示:
>>> from pprint import pprint
>>> dates = ['2006-03-28', '2006-04-05', '2006-04-06']
>>> flags = ['buy', 'buy', 'sell']
>>> tickers = ['IBM', 'MSFT', 'IBM']
>>> amount = [1000, 1000, 500]
>>> price = [45.00, 72.00, 53.00]
>>> rows = zip(dates, flags, tickers, amount, price)
>>> pprint(rows)
[('2006-03-28', 'buy', 'IBM', 1000, 45.0),
('2006-04-05', 'buy', 'MSFT', 1000, 72.0),
('2006-04-06', 'sell', 'IBM', 500, 53.0)]
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> conn.execute('''
... CREATE TABLE stocks (
... date datetime,
... action string,
... symbol string,
... quantity integer,
... price real)
... ''')
<sqlite3.Cursor object at 0x10667bc70>
>>> cursor = conn.cursor()
>>> cursor.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', rows)
<sqlite3.Cursor object at 0x10667bce0>
>>> conn.commit()
>>> for row in cursor.execute('SELECT * FROM stocks'):
... print(row)
...
(u'2006-03-28', u'buy', u'IBM', 1000, 45.0)
(u'2006-04-05', u'buy', u'MSFT', 1000, 72.0)
(u'2006-04-06', u'sell', u'IBM', 500, 53.0)