通过Python在SQL查询中使用通配符和特殊字符
对Python还是有点陌生,所以请耐心听我说。我正在编写一个Python脚本来执行对几个MySQL数据库的审计,特别是通过通过Python在SQL查询中使用通配符和特殊字符,python,mysql,Python,Mysql,对Python还是有点陌生,所以请耐心听我说。我正在编写一个Python脚本来执行对几个MySQL数据库的审计,特别是通过value列中的一个目录提取变量信息。通过MySQL的简单查询是显示变量,其中的值类似于“/%”,这就是我在这个脚本中尝试转换和使用的内容。第一个问题似乎是声明%通配符,因为Python将其视为一个字符串,但最重要的是声明/,因为我正在查找带有目录的任何变量 下面是有问题的脚本部分,后面是错误: def dbQuery(server,username,password):
value
列中的一个目录提取变量信息。通过MySQL的简单查询是显示变量,其中的值类似于“/%”代码>,这就是我在这个脚本中尝试转换和使用的内容。第一个问题似乎是声明%
通配符,因为Python将其视为一个字符串,但最重要的是声明/
,因为我正在查找带有目录的任何变量
下面是有问题的脚本部分,后面是错误:
def dbQuery(server,username,password):
conn = MySQLdb.connect(host=server, user=username, passwd=password, db="")
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
cursor.execute("SHOW VARIABLES WHERE VALUE LIKE $s", ('%%/%',))
result = cursor.fetchall()
#Cleanup
cursor.close()
conn.close()
编辑2:
睡了一会儿之后,我想我离它更近了,但还是错过了一些东西。我对变量做了一些改变,得到了一个结果,但不是我所期望的。所以我假设我已经很接近了,但还是遗漏了一部分。以下是改变的情况:
v = "'/%\'"
cursor.execute("SHOW VARIABLES WHERE VALUE LIKE %s", (v, ))
我知道,使用Bash脚本,您可以使用Bash-x
运行它们进行调试,并查看其中每个命令的输出。你可以用Python做类似的事情吗?如果可以,怎么做?如果我正确理解脚本不起作用的原因是因为%s
方法是游标。execute()
格式化变量发送的数据的一种方式,那么这可能会帮助我查看脚本将什么替换了%s。根据MySQL,它决定发送的数据是字符串、int还是任何其他类型。因此,如果您有一个变量var='hello world'
并希望将其发送到游标。execute()
,则需要编写
var = 'hello world'
cursor.execute("SHOW VARIABLES WHERE VALUE LIKE %s;", (var))
result = cursor.fetchall()
#Cleanup
cursor.close()
conn.close()
检查输入是否为字符串
我希望我回答了你的问题。我能够解决我的问题。事实证明,整个脚本中有一些事情导致了我的问题:
- 首先,由于我最初试图声明通配符变量的方式,它继续干扰。我从另一个来源得到了一个建议,建议对
%
使用ASCII标识符的转换。它需要声明更多的变量,但我确实让它工作了:
- 第二,在我的定义(见上文)的末尾,我缺少了一个
返回结果
,因此在脚本的其余部分没有执行结果,从而触发了我后来设置的一些失败条件
或者用前面的反斜杠转义特殊字符,或者阅读关于。因此,我将查询分离为一个单独的变量,并重新执行/%
以处理原始字符串参数。看起来它仍然在引起同样的问题。以下是更改:`v=“\t'/%'\n”`query=“”显示变量,其中值为$s”“”
很抱歉格式化-注释只允许这么多。问题是使用WHERE时,%
通配符。。。喜欢语句被python用来标记字符串,因此查询将尝试基本上作为显示变量运行,其中的值类似于“/”
,并且不会返回正确的结果,因为我想从SHOW变量中找到任何以/开头并具有任何类型的以下字符的内容。
v = "'/%\'"
cursor.execute("SHOW VARIABLES WHERE VALUE LIKE %s", (v, ))
var = 'hello world'
cursor.execute("SHOW VARIABLES WHERE VALUE LIKE %s;", (var))
result = cursor.fetchall()
#Cleanup
cursor.close()
conn.close()
def dbQuery(server,username,password):
conn = MySQLdb.connect(host=server, user=username, passwd=password, db="")
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
v = chr(37)
v2 = '/'
v3 = v2 + v
cursor.execute("SHOW VARIABLES WHERE VALUE LIKE %s", (v3, ))
result = cursor.fetchall()
#Cleanup
cursor.close()
conn.close()
return result