为什么我的MySQL存储过程在通过Python调用os.system()或subprocess.Popen()时不执行?

0 投票
1 回答
803 浏览
提问于 2025-04-16 10:59

我有一个.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_valstderr_val都是空字符串)。我还尝试用BEGINEND $$包裹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)

shlex.split

撰写回答