我目前正在从SQLite3数据库中提取数据,该数据库总共包含4个表:“intra_day”,“closing_price”,“vol_”和“intra_day2”。我希望按日期从3个表中提取数据,以某种方式解析它,重新格式化数据行,然后将其重新插入第4个表。
我正在创建2个游标,一个用于提取数据,另一个用于将其插入(这可能是不正确的方法)
import sqlite3
import time
import datetime
conn = sqlite3.connect('stu3.sqlite3', detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cur = conn.cursor()
cur.execute('SELECT intra_day.date, intra_day.time, intra_day.price, closing_price.cprice, vol_.vol FROM intra_day, closing_price, vol_ WHERE intra_day.date = closing_price.date AND vol_.date = intra_day.date')
conn2 = sqlite3.connect('stu3.sqlite3', detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cur2 = conn2.cursor()
然后我按如下方式解析提取的数据:
for row in cur:
date_intra, time_intra, price_intra, cprice, vol = (row[0], row[1], float(row[2]), float(row[3]), float(row[4]))
dt_intra = datetime.datetime.strptime('{} {}'.format(date_intra.partition(' ')[0], time_intra),'%d/%m/%Y %H:%M:%S')
nline = dt_intra, price_intra, cprice, vol
cur2.execute('INSERT INTO intra_day2 (date, price, price2, vol) VALUES (?, ?, ?, ?)',
(nline))
conn.commit()
它似乎只是提交最后的“nline”而不是提取和解析的200K +数据行。
我的INSERT功能是否缩进错误?
我尝试了几种变体,我或者没有提交到intra_day2表,或者只是一行(我假设它是数据中的最后一行)。
答案 0 :(得分:1)
首先,您应该声明一个交易。我不确定您使用的是哪种库和语言,但SQL中的等价物是BEGIN TRANSACTION
。在你的循环之外做那件事。然后,循环所有插入,在循环之后,执行conn.commit()
。
答案 1 :(得分:1)
使用单一连接。
在提交事务之前关闭两个游标。 (所有这些都应该在循环之后完成。)