我有一个可以进行一些转换的工作程序,但我非常害怕,如果数据库太大,会发生什么。
我会告诉你,如果下面的程序在中间炸弹我将如何让程序恢复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()
答案 0 :(得分:2)
如果下面的程序在中间炸弹,我将如何恢复程序o从指定的代码行开始工作
你不能。
你的代码完全是神秘的,因为除了第一个插入之外,create table在每次插入之前都会出错。
但是,如果您想从一个旧表到一个新表中执行一系列长插入, 而且你担心它没有正确完成的可能性,你有两种选择来维护所需的状态信息。
独特的钥匙。
批处理。
查询。
唯一键。
如果每一行都有一个唯一键,那么一些插入将会出错,因为该行是重复的。
如果程序“炸弹”,你只需重新启动即可。你得到了很多重复(你期望的)。这不是低效率。
<强>批次强>
我们使用的另一种技术是查询旧表中的所有行,并包含每1000行递增的“批处理”号。 batch_number = row_count // 1000
。
您创建一个编号为-1
的“批号”文件。
您的程序启动,它会读取批号。这是最后一批完成的。
您可以阅读源数据,直至获得批号&gt;最后一个完成。
然后,您可以批量执行所有插入操作。
批次编号更改时,执行提交,并将批次编号写入文件。这样你就可以在任何批次上重启。
在“炸弹”之后重新启动时,您可能会从部分批次(您期望的)获得一些重复项。这不是低效率。
<强>查询强>
您可以在每次插入之前查询以查看该行是否存在。这是低效的。
如果您没有唯一键,则必须执行复杂查询以查看该行是否是由上一次运行的程序创建的。