【问题标题】:MySQL stored procedure sometimes returns 0 rowsMySQL 存储过程有时会返回 0 行
【发布时间】:2017-08-25 15:25:25
【问题描述】:

编辑:我现在尝试了 pyodbc 和 pymysql,结果相同(调用存储过程时返回零行)。之前忘了提到这是在 Ubuntu 16.04.2 LTS 上使用 MySQL ODBC 5.3 驱动程序 (libmyodbc5w.so)。


我在 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()

通常情况下,它工作得很好。但每隔一段时间,它几乎立即完成,但结果集中有零行。我看不到任何错误或任何东西,只是什么都没有......再次运行它,没有问题。

【问题讨论】:

    标签: python mysql odbc pyodbc pymysql


    【解决方案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 部分即可。

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      相关资源
      最近更新 更多