MySQL存储过程有时返回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() 

往往不是,它工作得很好。但每隔一段时间,它几乎立即完成,但结果集中的行数为零。没有错误,我可以看到或任何东西,只是没有...再次运行,没有问题。

原来,问题与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部分。