2017-08-25 49 views
0

編輯:我現在已經嘗試pyodbc以及pymysql,並具有相同的結果(調用存儲過程時返回零行)。之前忘了提及這是在Ubuntu 16.04.2 LTS中使用MySQL ODBC 5.3驅動程序(libmyodbc5w.so)。MySQL存儲過程有時返回0行


我在Python 3.5.2上使用pymysql(0.7.11),對MySQL 5.6.10數據庫執行各種存儲過程。我遇到了一個奇怪且不一致的問題,我偶爾會返回零結果,儘管我可以立即重新運行完全相同的代碼並獲得我期望的行數。

的代碼是非常簡單的...

from collections import OrderedDict 
import pymysql 
from pymysql.cursors import DictCursorMixin, Cursor 

class OrderedDictCursor(DictCursorMixin, Cursor): 
    dict_type = OrderedDict 

try: 
    connection = pymysql.connect( 
     host=my_server, 
     user=my_user, 
     password=my_password, 
     db=my_database, 
     connect_timeout=60, 
     cursorclass=pymysql.cursors.DictCursor 
     ) 

    param1 = '2017-08-23 00:00:00' 
    param2 = '2017-08-24 00:00:00' 

    proc_args = tuple([param1, param2]) 

    proc = 'my_proc_name' 

    cursor = connection.cursor(OrderedDictCursor) 
    cursor.callproc(proc, proc_args) 
    result = cursor.fetchall() 
except Exception as e: 
    print('Error: ', e) 
finally: 
    if not isinstance(connection, str): 
     connection.close() 

往往不是,它工作得很好。但每隔一段時間,它幾乎立即完成,但結果集中的行數爲零。沒有錯誤,我可以看到或任何東西,只是沒有...再次運行,沒有問題。

回答

1

原來,問題與pymysql,odbc等無關,而是參數傳遞給存儲過程的順序有問題。

在我的桌面上,我使用的是Python 3.6,而且工作得很好。我沒有意識到,3.5.2和3.6之間的一個變化影響了通過json.loads添加到字典對象的項目是如何排序的。

傳遞的參數來自最初通過json.loads填充的dict對象...因爲它們在3.6之前是無序的,運行代碼偶爾會意味着我的starttime和endtime參數被傳遞給MySQL存儲過程向後。因此,返回零行。

一旦我意識到這是問題,修復它只是將object_pairs_hook = OrderedDict添加到json.loads部分。