这段代码只在DB中写一行?

时间:2012-02-13 13:19:13

标签: python sqlite

此代码只在DB中写入一行

我发现此代码中没有错误。 。

但是为什么这不插入超过第一行?

def transremovechars():
    cur.execute('drop table transforms')
    char_cfg = config.get('Transform_Variables', 'Chars_to_be_removed')      #Reads all the special chars to be removed from specialchars.txt#
    cur.execute('select * from originallist')
    for row in cur:                                                         #Applies transformation to remove chars for each row in a loop#
        company = row[0]
        for specialchars in char_cfg:
            company =  company.replace(specialchars, '')
        cur.execute('Insert into transforms (Transresult1) values (\'' + company + '\')')
    con.commit() 

3 个答案:

答案 0 :(得分:2)

您忘记了cur.fetchall()

def transremovechars():
    cur.execute('drop table transforms')
    char_cfg = config.get('Transform_Variables', 'Chars_to_be_removed')      #Reads all the special chars to be removed from specialchars.txt#
    cur.execute('select * from originallist')
    for row in cur.fetchall():                                                         #Applies transformation to remove chars for each row in a loop#
        company = row[0]
        for specialchars in char_cfg:
            company =  company.replace(specialchars, '')
        cur.execute('Insert into transforms (Transresult1) values (\'' + company + '\')')
    con.commit() 

答案 1 :(得分:1)

在使用之前,您似乎放弃了表transforms。你确定要的吗?或者您可能忘记显示再次创建它的代码?

如果您只使用第1列,则select *可能会过度杀伤。也许您想在SELECT

中命名该字段

此外,您应该用

替换INSERT行
cur.execute('Insert into transforms (Transresult1) values (?)', company)

然而,迭代光标应该没问题。也许您可以在print循环中插入一些for语句...

答案 2 :(得分:1)

评论你应该cur.fetchall()并迭代它将会起作用并且没问题。您的代码中的真正错误是,一旦您使用cur进行插入,它就是一个“新事物”并且原始生成器被重置(cur具有next())方法。

您可以根据需要使用cur而不进行fetchall,只需创建第二个游标ins_cur = con.curson()并使用它们。通过迭代或使用在一个连接上打开的多个游标,可以实现更多高级效果。

是的,请为您的dbapi模块使用正确的variable binding