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 で MySQL のストアドプロシージャの OUT パラメータを取得する 1


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 テーブルにレコードが挿入され、次のように出力されます。

Python で MySQL のストアドプロシージャの OUT パラメータを取得する 2

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 パラメータを取得する方法についてご説明しました。

© 2024 やさしい Python 入門