为什么我的MySQL存储过程在通过Python调用os.system()或subprocess.Popen()时不执行?
我有一个.sql文件,这个文件用来创建和执行一个存储过程。这个.sql文件的结构大致是这样的:
delimiter $$
drop procedure if exists `myProcedure`$$
create procedure `myProcedure` (
input INT
)
BEGIN
... sql statements;
END $$
call myProcedure(10);
$$
当我在命令行中以以下方式执行这个文件时,存储过程会被创建,并且最后的call
语句也能正常执行。
mysql -uuser -ppassword -hhost db_name < mysql_proc.sql
但是,当我在我的Python脚本中执行上述命令时,最后的call
语句却没有被执行。这是我在Python脚本中执行命令的方式:
command = 'mysql -uuser -ppassword -hhost db_name < mysql_proc.sql'
mysql_cmd_proc = subprocess.Popen(command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout_val, stderr_val = mysql_cmd_proc.communicate()
print 'mysql command stdout: %s' % stdout_val
print 'mysql command stderr: %s' % stderr_val
没有任何错误或输出返回(stdout_val
和stderr_val
都是空字符串)。我还尝试用BEGIN
和END $$
包裹call myProcedure(10); $$
,但也没有帮助。请问这可能是什么原因呢?
1 个回答
1
command = 'mysql -uuser -ppassword -hhost db_name < mysql_proc.sql'
mysql_cmd_proc = subprocess.Popen(command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
不要使用 shell=True
(默认情况下应该是 False
)。另外,传递 command
时要用列表的形式。
可以这样做:
>>> import shlex
>>> command = 'mysql -uuser -ppassword -hhost db_name < mysql_proc.sql'
>>> mysql_cmd_proc = subprocess.Popen(shlex.split(command), # shlex.split
... stdout=subprocess.PIPE,
... stderr=subprocess.PIPE)