3

我有正在执行数据库操作的函数。我想做一些特别的事情,在尝试从数据库中获取数据之前,我想检查游标对象是否为空以及连接是否由于超时而断开。如何在 Python 中进行预检查?

我的功能,foo,bar:

 Class A:
   connect = None
   cursor = None

   def connect(self)
      self.connect = MySQLdb.connect ( ... )
      self.cursor = self.connect.cursor()
   def foo (self) :
       self.cursor.execute("SELECT * FROM car_models");
   def bar (self) :
       self.cursor.execute("SELECT * FROM incomes");
4

2 回答 2

5

操作前检查的问题在于,您要检查的不良情况可能发生在检查和操作之间。

例如,假设您有一个方法is_timed_out()来检查连接是否超时:

if not self.cursor.is_timed_out():
    self.cursor.execute("SELECT * FROM incomes")

从表面上看,这看起来您已经避免了执行调用中出现 CursorTimedOut 异常的可能性。但是你有可能调用is_timed_out,得到一个False,然后光标超时,然后你调用execute函数,得到一个异常。

是的,它会在正确的时刻发生的机会非常小。但是在服务器环境中,百万分之一的机会每天会发生几次。坏的东西。

您必须准备好让您的操作因异常而失败。一旦你为这些问题进行了异常处理,你就不再需要预先检查,因为它们是多余的。

于 2013-03-30T13:37:18.553 回答
1

您可以轻松检查光标是否为空:

if cursor is None:
     ... do something ...

否则,Python 中通常的做法是“请求宽恕而不是许可”:使用您的数据库连接,如果它已超时,则捕获异常并处理它(否则您可能会发现它在您的测试和您的测试点之间超时用它)。

于 2013-03-30T13:32:01.710 回答