我的python程序是否有任何特定的方法可以从被杀死的行继续?

时间:2012-02-09 10:49:06

标签: python sqlite exception

我有一个可以进行一些转换的工作程序,但我非常害怕,如果数据库太大,会发生什么。

  

我会告诉你,如果下面的程序在中间炸弹我将如何让程序恢复o从指定的代码行开始工作。

执行一段代码后,该过程将被杀死。

该程序是否能够从错误发生的地方继续回来,或者从它被杀的位置继续回来。

import sqlite3 as sqlite
import ConfigParser
config = ConfigParser.RawConfigParser()
config.read('removespecial.ini')

con = sqlite.connect('listofcomp.sqlite')
cur = con.cursor()

def transremovechars():
    char_cfg = open('specialchars.txt', 'r')        #Reads all the special chars to be           removed from specialchars.txt#
    special_chars = char_cfg.readline()
    char_cfg.close()
    cur.execute('select * from originallist')       
for row in cur:                                 #Applies transformation to remove chars for each row in a loop#
    company = row[0]
    for bad_char in special_chars:
            company =  company.replace(bad_char, '')
            cur.execute('Create table transform1 (Names Varchar, Transformtype Varchar')
            cur.execute('Insert into transform1 (Names)', company)


def transtolower():
    cur.execute('select * from transform1')         #Transformation to convert all the namesto lower cases#
    for row in cur:
        company = row[0]
        company = company.lower()
        cur.execute('Create table transform2 (Names Varchar, Transformtype Varchar')        #Creates another table named transform2#
        cur.execute('Insert into transform2 (Names)', company)                              #Copies all the lower cased names to transform2#



if __name__=="__main__":

transremovechars()
transtolower()  

1 个答案:

答案 0 :(得分:2)

  

如果下面的程序在中间炸弹,我将如何恢复程序o从指定的代码行开始工作

你不能。

你的代码完全是神秘的,因为除了第一个插入之外,create table在每次插入之前都会出错。

但是,如果您想从一个旧表到一个新表中执行一系列长插入, 而且你担心它没有正确完成的可能性,你有两种选择来维护所需的状态信息。

  1. 独特的钥匙。

  2. 批处理。

  3. 查询。

  4. 唯一键

    如果每一行都有一个唯一键,那么一些插入将会出错,因为该行是重复的。

    如果程序“炸弹”,你只需重新启动即可。你得到了很多重复(你期望的)。这不是低效率。

    <强>批次

    我们使用的另一种技术是查询旧表中的所有行,并包含每1000行递增的“批处理”号。 batch_number = row_count // 1000

    您创建一个编号为-1的“批号”文件。

    您的程序启动,它会读取批号。这是最后一批完成的。

    您可以阅读源数据,直至获得批号&gt;最后一个完成。

    然后,您可以批量执行所有插入操作。

    批次编号更改时,执行提交,并将批次编号写入文件。这样你就可以在任何批次上重启。

    在“炸弹”之后重新启动时,您可能会从部分批次(您期望的)获得一些重复项。这不是低效率。

    <强>查询

    您可以在每次插入之前查询以查看该行是否存在。这是低效的。

    如果您没有唯一键,则必须执行复杂查询以查看该行是否是由上一次运行的程序创建的。