查询阻止时如何捕获此警告消息?

时间:2011-09-23 00:10:00

标签: python sybase-ase

当我使用isql进行查询时,我收到以下消息和查询块。

  

数据库foo中的事务日志几乎已满。您的交易将被暂停,直到日志中有可用空间为止。

当我从Python做同样的事情时:

cursor.execute(sql)

查询阻止,但我希望看到此消息。

我试过了:

Sybase.set_debug(sys.stderr)
connection.debug = 1

我正在使用:

  • python-sybase-0.40pre1
  • Adaptive Server Enterprise / 15.5 / EBF 18164

编辑:问题是,“如何在python程序中捕获此警告消息?”

3 个答案:

答案 0 :(得分:1)

好问题,我不确定我能否完全回答。以下是一些想法。

Sybase.py使用日志记录。确保您使用它。为了“阻止”退出,我会这样做:

import logging
logging.basicConfig(level = logging.INFO,
                    format = "%(asctime)s %(levelname)s [%(filename)s] (%(name)s) %(message)s",
                    datefmt = "%H:%M:%S", stream = sys.stdout)
log = logging.getLogger('sybase')
log.setLevel(logging.DEBUG)

显然(为什么超出我?)要在Sybase.py中使用它,你需要设置一个全局DEBUG=True(见第38行)

但是如果我们看一下def execute,我们可以看到(正如你指出的那样)它是阻塞的。我们会回答你的问题。你不会得到任何回报,因为它阻止了它。那么你如何解决这个问题 - 编写一个非阻塞的执行方法;)examples / timeout.py中有一些提示。显然其他人已经对此表示不满,但还没有真正修复它。

我知道这可能没有帮助,但我花了15分钟看 - 我至少应该告诉你我发现了什么......你会认为execute会给你一些result - 等等第707行的结果值是什么?

                while 1:
                    status, result = self._cmd.ct_results()
                    if status != CS_SUCCEED:
                        break

如果status!= CS_SUCCEED(我假设你的情况是True),你能看到“结果”等于什么?我想知道他们是否只是将结果提升为异常?

答案 1 :(得分:-1)

原因很明显,事务日志已满,你可以在sybase MDA表monSysStatement中查看blocikng查询。这里你可以检查sql语句哪个占用高Io,时间,行数影响等。

答案 2 :(得分:-1)

您的查询可能很大,这会溢出事务日志(例如,您正在插入大型二进制文件)。或者,如果这是一个选项,您可能不会经常截断您的事务日志。

在运行时期间,您将需要一个捕获异常错误的except语句。

请参阅Sybase Python documentation