This is effectively how i’m using _mssql.
Everything works fine, even after i use fetch_array().
The problem is, when I iterate through fetch_array(), it takes over ten minutes for 6K rows to be written to the body of an email. This just isn’t acceptable.
Is there a better way for me to do this?
EDIT: haven’t figured out the best way to copy python code here but here is the crappily formatted code used.
code for writing the email body:
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'
Could you show us some code of iterating through the results and creating an email? If I had to make a wild guess, I would say you are probably violating this idiom: “Build strings as a list and use ”.join at the end.” If you keep adding to a string as you go you create a new (and progressively larger) string on each iteration, which runs in quadratic time.
(Turned this comment into an answer at the request of the OP. Will edit to more complete answer as needed.)
Edit:
Ok, my guess was correct. You’ll want something like this: