由于管理系统中对mysql管理的开发中用到了saltstack集成的mysql模块其中一个主要的功能是 mysql.query
官方文档中的两个示例:
salt.modules.mysql.query(database, query, **connection_args)
Run an arbitrary SQL query and return the results or the number of affected rows.
CLI Example:
salt "*" mysql.query mydb "UPDATE mytable set myfield=1 limit 1"
Return data:
{"query time": {"human": "39.0ms", "raw": "0.03899"}, "rows affected": 1L}
CLI Example:
salt "*" mysql.query mydb "SELECT id,name,cash from users limit 3"
Return data:
{"columns": ("id", "name", "cash"),
"query time": {"human": "1.0ms", "raw": "0.001"},
"results": ((1L, "User 1", Decimal("110.000000")),
(2L, "User 2", Decimal("215.636756")),
(3L, "User 3", Decimal("0.040000"))),
"rows returned": 3L}
我测试的一个示例:
salt www.pyadmin.com mysql.query salt "explain select * from salt_events"
www.pyadmin.com:
----------
query time:
----------
human:
14.0ms
raw:
0.01402
rows affected:
1
观察官方的和我测试的输出显示结果来看只有 SELECT 语句显示了希望的结果。
那么我要显示 explain的结果呢? 查看了好多遍官方的文档也没有头绪,只好从源代码入手了
首先找到这个相关的模块--mysql
主要位置在 /usr/local/lib/python2.7/dist-packages/salt/modules/mysql.py
注意:有的系统是在 site-packages 文件夹下
编辑这个文件找到如下位置:ret = {}
ret["query time"] = {"human": elapsed_h, "raw": str(round(elapsed, 5))}
select_keywords = ["SELECT", "SHOW", "DESC"]
select_query = False
for keyword in select_keywords:
if query.upper().strip().startswith(keyword):
select_query = True
break
if select_query:
ret["rows returned"] = affected
columns = ()
for column in cur.description:
columns += (column[0],)
ret["columns"] = columns
ret["results"] = results
return ret
else:
ret["rows affected"] = affected
return ret
在字典里面增加 “EXPLAIN” 这样一个元素select_keywords = ["SELECT", "SHOW", "DESC", "EXPLAIN"]
然后我们在来查看一下执行结果的输出:
www.pyadmin.com:
----------
columns:
- id
- select_type
- table
- partitions
- type
- possible_keys
- key
- key_len
- ref
- rows
- filtered
- Extra
query time:
----------
human:
0.24s
raw:
0.23805
results:
|_
- 1
- SIMPLE
- salt_events
- None
- ALL
- None
- None
- None
- None
- 3707
- 100.00
- None
rows returned:
1
和修改之前的输出结果对比多了results 这一项。