有没有一种更有效的方法从python中的查询写入结果?

时间:2010-11-10 18:47:33

标签: python sql-server-2005

This实际上是我如何使用_mssql。

即使在我使用fetch_array()之后,一切正常。

问题是,当我遍历fetch_array()时,将6K行写入电子邮件正文需要十多分钟。这是不可接受的。

我有更好的方法吗?

编辑:还没有想出在这里复制python代码的最佳方法,但这里使用的是破旧格式的代码。

编写电子邮件正文的代码:

    results=mssql.fetch_array()  
    mssql.close()  
    resultTuple = results[0]  
    if resultTuple[1] == 0:  
        emailBody = 'Zero Rows returned'  
    if test or resultTuple[1] != 0:  
        i = 0              
        columnTuples = resultTuple[0]   
        listOfRows = resultTuple[2]  
        columns = []  
        emailBody = ''  
        if test: print 'looping results'  
        while i < len(columnTuples):  
            columns.append(columnTuples[i][0])  
            emailBody = emailBody + columns[i].center(20) + '\t'  
            i = i + 1          
        emailBody = emailBody + '\n'  
        for rowTuple in listOfRows: #row loop  
            for x in range(0, len(rowTuple)): #field loop  
                emailBody = emailBody + str(rowTuple[x]).center(20) + '\t'  
                if test: print x  
            emailBody = emailBody + '\n'  

1 个答案:

答案 0 :(得分:1)

您能否向我们展示一些迭代结果并创建电子邮件的代码?如果我不得不做出一个疯狂的猜测,我会说你可能违反了这个习惯用法:“将字符串构建为一个列表并在最后使用'.join。”如果你继续添加一个字符串,你就会在每次迭代时创建一个新的(逐渐变大的)字符串,该字符串在二次时间内运行。

(根据OP的要求将此评论转化为答案。将根据需要编辑更完整的答案。)

修改

好的,我的猜测是正确的。你会想要这样的东西:

email_lines = []
for row in result:
    line = do_something_with(row)
    email_lines.append(line)
email_body = '\n'.join*(email_lines)