我有一个创建并执行存储过程的 .sql 文件。 .sql文件的结构是这样的:
delimiter $$
drop procedure if exists `myProcedure`$$
create procedure `myProcedure` (
input INT
)
BEGIN
... sql statements;
END $$
call myProcedure(10);
$$
当通过以下方式从 shell 执行此操作时,将创建存储过程并正确执行末尾的 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
只是空字符串)。我尝试围绕 call myProcedure(10); $$
也带有 BEGIN
和 END $$
block ,但这也没有帮助。有什么原因导致这可能成为问题吗?
最佳答案
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
,默认情况下)。另外,将命令
作为列表传递。
这样做:
>>> 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)
关于python - 为什么当使用 os.system() 或 subprocess.Popen() 从 Python 调用时我的 MySQL 存储过程不执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4859805/