Python MySQL –用Python调用存储过程
简介:在本教程中,您将学习如何使用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中调用存储过程。