Python MySQL –用Python调用存储过程

时间:2019-11-20 08:52:18  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用MySQL Connector / Python API在Python中调用MySQL存储过程。

开始之前

如果您不熟悉MySQL存储过程,或者想复习一下它,可以遵循MySQL存储过程教程。

在本教程中,我们将为演示创建两个存储过程。

以下存储过程返回所有具有书籍和authors表中作者信息的书籍:

USE python_mysql;

DELIMITER $$

CREATE PROCEDURE find_all()
BEGIN
	SELECT 
		title, 
		isbn, 
        CONCAT(first_name,' ',last_name) AS author
	FROM books
	INNER JOIN book_author 
		ON book_author.book_id =  books.id
	INNER JOIN authors
		ON book_author.author_id = authors.id
	ORDER BY title;
END$$

DELIMITER ;

find_all()存储过程具有SELECT语句,该语句带有INNER JOIN子句,该子句可从book和authors表中检索标题,ISBN和作者的全名。

调用find_all()存储过程,您将获得以下结果集:

CALL find_all();

第二个存储过程称为find_by_isbn(),用于通过其ISBN查找书籍,如下所示:

DELIMITER $$

CREATE PROCEDURE find_by_isbn(
	IN p_isbn VARCHAR(13),
    OUT p_title VARCHAR(255)
)
BEGIN
	SELECT title 
    INTO p_title 
    FROM books
	WHERE isbn = p_isbn;
END$$

DELIMITER ;

find_by_isbn()接受两个参数:第一个参数是ISBN(IN参数),第二个是标题(OUT参数)。
当将ISBN传递给存储过程时,您将获得该书的标题,例如:

CALL find_by_isbn('1235927658929',@title);
SELECT @title;

这是输出:

+-------------------------------------------------+
| @title                                          |
+-------------------------------------------------+
| Debatable Land Between This World and the Next  |
+-------------------------------------------------+
1 row in set (0.00 sec)

从Python调用存储过程

要在Python中调用存储过程,请按照以下步骤操作:

  • 通过创建一个新的MySQLConnection对象连接到数据库。

  • 通过调用cursor()方法从MySQLConnection对象实例化一个新的MySQLCursor对象。

  • 调用MySQLCursor对象的callproc()方法。
    您将存储过程的名称作为callproc()方法的第一个参数传递。
    如果存储过程需要参数,则需要将列表作为第二个参数传递给callproc()方法。
    如果存储过程返回结果集,则可以调用MySQLCursor对象的stored_results()方法来获取列表迭代器,并使用fetchall()方法对该结果集进行迭代。

  • 照常关闭游标和数据库连接。

以下示例演示了如何在Python中调用find_all()存储过程并输出结果集。

from mysql.connector import MySQLConnection, Error
from python_mysql_dbconfig import read_db_config

def call_find_all_sp():
    try:
        db_config = read_db_config()
        conn = MySQLConnection(**db_config)
        cursor = conn.cursor()

        cursor.callproc('find_all')

        # print out the result
        for result in cursor.stored_results():
            print(result.fetchall())

    except Error as e:
        print(e)

    finally:
        cursor.close()
        conn.close()

if __name__ == '__main__':
    call_find_all_sp()

以下示例显示了如何调用find_by_isbn()存储过程。

from mysql.connector import MySQLConnection, Error
from python_mysql_dbconfig import read_db_config

def call_find_by_isbn():
    try:
        db_config = read_db_config()
        conn = MySQLConnection(**db_config)
        cursor = conn.cursor()

        args = ['1236400967773', 0]
        result_args = cursor.callproc('find_by_isbn', args)

        print(result_args[1])

    except Error as e:
        print(e)

    finally:
        cursor.close()
        conn.close()

if __name__ == '__main__':
    call_find_by_isbn()

find_by_isbn()存储过程需要两个参数,因此,我们必须传递一个包含两个元素的列表(args):第一个是isbn(1236400967773),第二个是0。
args列表的第二个元素(0)只是保存p_title参数的占位符。

callproc()方法返回一个包含两个元素的列表(result_args):第二个元素(result_args [1])保存p_title参数的值。

在本教程中,您学习了如何使用MySQLCursor对象的callproc()方法在Python中调用存储过程。