Python で MySQL のストアドプロシージャの OUT パラメータを取得する
ここでは Python で MySQL のストアドプロシージャを実行して、OUT パラメータを取得する方法についてご説明します。
MySQL Connector をインストールしていない方は、「Python で MySQL に接続する」をご参考に、MySQL に接続できる状態にしておいてください。
Python で MySQL のストアドプロシージャの OUT パラメータを取得する
Python で MySQL Connector を使って、MySQL のストアドプロシージャを実行するするには MySQLCursor の callproc() メソッドを使います。
実際に OUT パラメータのあるストアドプロシージャを実行してみましょう。
test データベースに次のような exams テーブルがあります。
CREATE TABLE exams (
exam_id INT NOT NULL AUTO_INCREMENT,
exam_name_en VARCHAR(50) NOT NULL,
exam_name_jp VARCHAR(50) NOT NULL,
PRIMARY KEY (exam_id)
);
そして、その exams テーブルにデータを挿入し、挿入したレコードの exam_id を OUT パラメータとして返す、insert_exam という名前のストアドプロシージャがあります。
DROP PROCEDURE IF EXISTS insert_exam;
DELIMITER //
CREATE PROCEDURE insert_exam (
in_exam_name_en VARCHAR(50),
in_exam_name_jp VARCHAR(50),
OUT out_new_exam_id INT
)
BEGIN
INSERT INTO exams
( exam_name_en, exam_name_jp )
VALUES
(in_exam_name_en, in_exam_name_jp);
SET out_new_exam_id = LAST_INSERT_ID();
END//
DELIMITER ;
Python でこのストアドプロシージャを実行して、OUT パラメータの値を取得するには、次のようにできます。
import mysql.connector
cnx = None
try:
cnx = mysql.connector.connect(
user='root', # ユーザー名
password='password', # パスワード
host='localhost', # ホスト名(IPアドレス)
database='test', # データベース名
autocommit=True
)
cursor = cnx.cursor()
args = ('English', '英語', 0)
result_args = cursor.callproc('insert_exam', args)
#cnx.commit()
print(f"exam_id = {result_args[2]}")
cursor.close()
except Exception as e:
print(f"Error Occurred: {e}")
finally:
if cnx is not None and cnx.is_connected():
cnx.close()
上のコードを実行すると、exams テーブルにレコードが挿入され、次のように出力されます。
exam_id = 1
まず、1 行目で mysql.connector をインポートして、6 ~ 12 行目で、connect() メソッドに、MySQL のユーザー名、パスワード、ホスト名、データベース名などを渡してコネクションを生成しています。
Python の MySQL のコネクターはデフォルトでは autocommit しませんので、コネクションをを生成する時に autocommit=True とするか、コメントアウトしてある 18 行目のように、各トランザクション後に commit() メソッドでコミットする必要があります。
14 行目で cursor を生成し、16 行目でストアドプロシージャに渡す引数を定義しています。
引数の 3 つめには、OUT パラメータの値を保持するために 0 を指定しています。
今回の OUT パラメータの引数は INT 型ですが、VARCHAR 型でも 0 で大丈夫です。
17 行目で callproc(ストアドプロシージャ名, 引数) を使って、ストアドプロシージャを実行し、戻り値を result_args に代入しています。
callproc() は戻り値として、入力の引数をコピーしたものに、OUT と INOUT パラメータは値が置き換えられたタプルを返します。
Python のインデックスは 0 から始まるので OUT パラメータの値は result_args[2] で取得できます。
20 行目で取得した exam_id をプリントしています。
以上、Python で MySQL のストアドプロシージャを実行して、OUT パラメータを取得する方法についてご説明しました。