pymysql-限制单次查询最大时间

昨天朋友提到一个问题,他用pymysql去查询数据库,如果一条查询超过XX秒没有返回结果,就放弃这次查询,问我在pymysql里有没有这样的设置。

官方文档看这里

我这边最后想到三种方法,但是感觉都不是很完美,暂时先记录一下,以后再补充。

pymysql:设置参数connect_timeout

官方解释:单位应该类似上面的read_timeout,是秒
Timeout before throwing an exception when connecting.
(default: 10, min: 1, max: 31536000)
用法

db = pymysql.connect('localhost','用户名','密码','数据库',connect_timeout=5)

超出时间就自动断连接了。那么,要怎么检查连接是不是还在呢?用下面这个布尔值。

db.open

timeout_decorator

安装就直接pip install timeout-decorator。它可以限定一段程序执行的时间。

举例
这样你只要捕获错误就好了。pymysql-限制单次查询最大时间_第1张图片
测试

>>> import timeout_decorator
>>> db = pymysql.connect('localhost','XX','XXX','XXXXXX')
>>> sql = 'select sleep(10);'
>>> @timeout_decorator.timeout(2)
... def te():
...     cursor = db.cursor()
...     cursor.execute(sql)
... 
>>> try:
...     te()
... except:
...     print("error")
... 
error
>>> db.open
False

可以看到,这样虽然能限制执行时间,不过执行完之后数据库是断连的。
如果看到下面这种报错,你的数据库也是断了的。
pymysql-限制单次查询最大时间_第2张图片

mysql:max_execution_time

这个参数用于在服务端对 select 语句进行超时时间限制。0表示没有限制。这样写不会影响数据库本身的设置。

  • mysql 5.6 中,名为: max_statement_time (毫秒)

  • mysql 5.7 以后,改成: max_execution_time (毫秒)

mysql> show variables like 'max_execution_time'
    -> ;
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_execution_time | 0     |
+--------------------+-------+
1 row in set (0.01 sec)

mysql里用法

mysql> select /*+max_execution_time(1000)*/ count(*) from sgrna where chr like 'NC_0%';
ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded
mysql> select /*+max_execution_time(0)*/ count(*) from sgrna where chr like 'NC_0%';
+----------+
| count(*) |
+----------+
|  2890038 |
+----------+
1 row in set (1.55 sec)

测试

sql1 = 'select /*+max_execution_time(1000)*/ count(*) from sgrna where chr like "NC_0%";'

pymysql-限制单次查询最大时间_第3张图片
不过这样之后pymysql也断连了:)

你可能感兴趣的:(python大法好,mysql,数据库,python)