2016-04-01 206 views
1

我在玩Python和MySQL中的大數據。python MySQL連接器

我有一個巨大的表,我需要插入新行,而我正在獲取查詢的結果。

我得到這個錯誤:

Traceback (most recent call last): 
    File "recsys.py", line 53, in <module> 
    write_cursor.executemany(add_sim, data_sims) 
    File "/Library/Python/2.7/site-packages/mysql/connector/cursor.py", line 603, in executemany 
    self._connection.handle_unread_result() 
    File "/Library/Python/2.7/site-packages/mysql/connector/connection.py", line 1057, in handle_unread_result 
    raise errors.InternalError("Unread result found") 
mysql.connector.errors.InternalError: Unread result found 

的代碼是以下之一:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import logging 
import mysql.connector 

import numpy 
import scipy 
from scipy.spatial import distance 

logging.basicConfig(filename='recsys.log', level=logging.INFO) 

cnx = mysql.connector.connect(user='...', password='...', database='...') 

cursor = cnx.cursor(dictionary=True) 
write_cursor = cnx.cursor() 


query = ("...") 

cursor.execute(query) 

while True: 
    rows = cursor.fetchmany(100) 
    if not rows: 
     break 

    add_sim = ("...") 
    data_sims = [] 

    for row in rows: 
     f1 = row['f1'] 
     f2 = row['f2'] 
     v1 = [[row['a1'], row['b1'], row['c1']]] 
     v2 = [[row['a2'], row['b2'], row['c2']]] 

     c = 1 - scipy.spatial.distance.cdist(v1, v2, 'cosine') 

     if c > 0.8: 

      data_sim = (f1, f2, c) 
      data_sims.append(data_sim) 

    write_cursor.executemany(add_sim, data_sims) 
    cnx.commit() 

cursor.close() 

cnx.close() 

我知道我可以使用一個緩衝連接到MySQL,但它不是一個不錯的選擇我的情況是因爲我的桌子有多大!

回答

3

這是cursor.fetchmany()一個記錄的行爲:

You must fetch all rows for the current query before executing new statements using the same connection.

爲了解決這個問題,你可以建立一個新的連接被write_cursor使用:

cnx_write = mysql.connector.connect(...) 
write_cursor = cnx_write.cursor() 
0

我已經當了類似的問題,我是線程化的,只需要關閉並分別在每個線程中打開一個新的連接...而不是打開連接。