我需要从Python 2.4运行MySQL查询,但无法下载/安装Python的任何模块。
我无法下载的原因是因为此脚本要在服务器(RedHat)上运行,并且我们的客户不会让我们下载和安装任何东西。
我一直在尝试使用subprocess,但是我正在使用的查询给了我一个syntax error。
如果我从查询浏览器运行该查询,则该查询可在Python外部运行,但是在subprocess命令中添加引号和逗号[]会使情况有些混乱。
我正在尝试运行的命令如下:
subprocess.call(['mysql', '-D DB', '--user="user"', '--password="password"', '-e', '"SELECT cu, control_name FROM PresetProfile WHERE NOT cu='' AND NOT control_name='' INTO OUTFILE '/directory/for/output.file' FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n';"', shell=True])
我得到的语法错误指向:after之前的单引号FIELDS TERMINATED BY。
File "", line 1
subprocess.call(['mysql', '-D DB', '--user="user"', '--password="password"', '-e', '"SELECT cu, control_name FROM PresetProfile WHERE NOT cu='' AND NOT control_name='' INTO OUTFILE '/directory/for/output.file' FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n';"', shell=True])
^
SyntaxError: invalid syntax
一旦创建了此输出文件,就可以停止使用子进程,然后返回常规文件处理。
解决方案
您的查询是这样的:'"SELECT cu, control_name FROM PresetProfile WHERE NOT cu='' AND NOT control_name='' INTO OUTFILE '/directory/for/output.file' FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n';"'
请注意,您已经'在字符串中了-您需要对它们进行转义或使用三引号。
'"SELECT cu, control_name FROM PresetProfile WHERE NOT cu=\'\' AND NOT control_name=\'\' INTO OUTFILE \'/directory/for/output.file\' FIELDS TERMINATED BY \':\' LINES TERMINATED BY \'\\n\';"'
另外,您可能想丢掉shell=True一点-如果仅使用Python,则转义的管理就很困难。一旦需要再次退出外壳,事情就会变得更加混乱。