2011-02-01 10 views
0

私は、ストアドプロシージャを作成して実行する.sqlファイルを持っています。 .sqlファイルの構造は次のようである:これは、次のようにシェルから実行された場合os.system()またはsubprocess.Popen()を使用してPythonから呼び出されたときにMySQLストアドプロシージャが実行されないのはなぜですか?

delimiter $$ 
drop procedure if exists `myProcedure`$$ 
create procedure `myProcedure` (
    input INT 
) 
BEGIN 
    ... sql statements; 
END $$ 

call myProcedure(10); 
$$ 

、ストアドプロシージャが作成され、最後にcall文が正常に実行されます。私はPythonスクリプトから上記のコマンドを実行したときに

mysql -uuser -ppassword -hhost db_name < mysql_proc.sql 

しかし、最後に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はちょうど空の文字列で)戻りました。私はcall myProcedure(10); $$BEGINEND $$ブロックで囲んでみましたが、どちらも役に立ちませんでした。これが問題になる理由は何ですか?

答えて

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) 

(それがデフォルトであるFalse、あるべき)shell=Trueを使用しないでください。また、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

関連する問題