Python for循环只将最后一行数据提交到SQLite3表 - 需要提交所有行

时间:2014-06-26 14:47:41

标签: python-2.7 sqlite

我目前正在从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表,或者只是一行(我假设它是数据中的最后一行)。

2 个答案:

答案 0 :(得分:1)

首先,您应该声明一个交易。我不确定您使用的是哪种库和语言,但SQL中的等价物是BEGIN TRANSACTION。在你的循环之外做那件事。然后,循环所有插入,在循环之后,执行conn.commit()

答案 1 :(得分:1)

使用单一连接。

在提交事务之前关闭两个游标。 (所有这些都应该在循环之后完成。)