通过Python在SQL查询中使用通配符和特殊字符

通过Python在SQL查询中使用通配符和特殊字符,python,mysql,Python,Mysql,对Python还是有点陌生,所以请耐心听我说。我正在编写一个Python脚本来执行对几个MySQL数据库的审计,特别是通过value列中的一个目录提取变量信息。通过MySQL的简单查询是显示变量,其中的值类似于“/%”,这就是我在这个脚本中尝试转换和使用的内容。第一个问题似乎是声明%通配符,因为Python将其视为一个字符串,但最重要的是声明/,因为我正在查找带有目录的任何变量 下面是有问题的脚本部分,后面是错误: def dbQuery(server,username,password):

对Python还是有点陌生,所以请耐心听我说。我正在编写一个Python脚本来执行对几个MySQL数据库的审计,特别是通过
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