Python / MySQL:无数据 - 提取,选择或处理零行

时间:2012-07-12 21:17:17

标签: python mysql

我遇到错误“没有数据 - 获取,选择或处理零行”的问题。

由于下面的答案描述了问题以及可能的解决方案,因此我将此问题缩短了。

追溯是:

cursor.execute("select function_1() from dual") 

/django/lib/python2.6/django/db/backends/util.py in execute
15.             return self.cursor.execute(sql, params) 

/django/lib/python2.6/django/db/backends/mysql/base.py in execute
86. return self.cursor.execute(query, args) 

usr/local/lib/python2.6/site-packages/MySQLdb/cursors.py in execute
176.       if not self._defer_warnings: self._warning_check() 

/usr/local/lib/python2.6/site-packages/MySQLdb/cursors.py in _warning_check
92.                   warn(w[-1], self.Warning, 3) 

1 个答案:

答案 0 :(得分:2)

我花了很长时间处理这个问题:"没有数据 - 零行被提取,选择或处理"。我意识到问题的一部分是不同版本的MySQL(或者Django和Python)会导致不同的行为。我不认为这是Python或Django特有的,但不知道。我不知道它是否与设置的某些变量有关,而不是不同版本中固有的变量。

两套版本是:

  • set1:(MySQL:5.5.19),(Python:2.7.1),(Django:1.3.0)
  • set2:(MySQL:5.0.05),(Python:2.6.8),(Django:1.2.4)

我的所作所为:

在Python中(通过Django):

cursor.execute("select function_1() from dual")
cursor.fetchall()

说明:

  • 虚拟查询是指数据库的任何查询,它保证返回一行,但在代码逻辑中没有任何用途。
  • continue_handler_1329是:声明继续处理程序为1329开始结束;

在VERSION SET1中

CASE 1a:Python调用function_1,其LAST查询返回NULL。我们得到了错误。

  • 通过在末尾包含虚拟查询(或确保最后一个查询不返回null)来修复。
  • 假设function_1没有游标,则包括continue_handler_1329无效。见下文。

CASE 1b:Python调用function_1,它调用function2。没有mysql游标。如果function2的LAST查询返回null:仍然正确评估Function2并将正确的值返回给function1。

  • 无需修复。
  • 包括continue_handler_1329(在任一函数中)无效(它仍然有效)。

CASE 1c:Python调用function_1,它打开一个调用function2的游标(在游标循环内或游标中选择自身)。如果function2的LAST查询返回null:这很糟糕。光标立即关闭,function_1继续,就像光标已被评估一样。没有警告。

  • 通过在f​​unction2末尾包含虚拟查询(或确保其最后一个查询不返回null)来修复
  • 在function2中包含continue_handler_1329无效。
  • 在function_1中包含continue_handler_1329会导致无限循环。当光标用完行时,光标不会在自己的处理程序中结束,而是在新处理程序中结束,而不是设置Done = True。

VERSION SET1的结论:

  • 将最后一个虚拟查询添加到从Python调用的函数以及可以从游标调用的任何函数。或者以其他方式确保这些函数的最后一个查询永远不会返回null。 continue_handler_1329无法解决问题,并且会导致游标函数出现问题(除非continue_handler_1329在其自己的范围内)。

在VERSION SET2中

CASE 2a:Python调用function_1,其中ANY查询返回NULL。我们得到了错误。

  • 没有虚拟查询可以解决此问题。
  • 通过包含continue_handler_1329来修复,假设function_1没有任何游标(见下文)。或者确保没有查询返回null。

CASE 2b:Python调用function_1,它调用function2。没有mysql游标。如果function2s有任何返回null的查询:我们得到错误。

  • 没有虚拟查询可以解决此问题。
  • 通过在f​​unction2中包含continue_handler_1329(或确保没有查询返回null)来修复。
  • 在function1中包含continue_handler_1329无效,除非它有游标(见下文)

CASE 2c:Python调用function_1,它打开一个调用function2的游标(在游标循环内或 在光标中选择自己)。如果function2有任何返回null的查询:我们得到错误。

  • 没有虚拟查询可以解决此问题。
  • 通过在f​​unction2中包含continue_handler_1329(或确保没有查询返回null)来修复。
  • 在function_1中包含continue_handler_1329会导致无限循环。当光标用完行时,光标不会在自己的处理程序中结束,而是在新处理程序中结束,而不是设置Done = True。

总结版本SET2

  • 将continue_handler_1329添加到任何可能使查询返回null的函数,但带有游标的函数除外。这些不应包含任何返回null的查询,但声明的游标本身除外。但是,使用游标的函数可能包含一个单独的begin-end范围,其中包含null-returning-query和continue_handler_1329。

总之,它可以同时使用:

  • 将continue_handler_1329添加到可能包含返回null的查询的所有函数,并将最后一个虚拟查询添加到从Python调用的函数,以及可以从游标调用的任何函数。具有游标的函数可能不包含continue_handler_1329,也不会返回null,除非它们位于单独的开始结束范围内。 (游标查询本身可能返回null,这将由游标的继续处理程序处理。)。