python连接mysql调用存储过程示例


以下是一个使用Python连接MySQL数据库并调用存储过程的示例。这个示例将使用`mysql-connector-python`库,这是MySQL官方提供的Python数据库连接器。

首先,确保你已经安装了`mysql-connector-python`。如果没有安装,你可以通过pip来安装它:


pip install mysql-connector-python

然后,你可以使用以下Python代码来连接MySQL数据库并调用一个存储过程:


import mysql.connector
from mysql.connector import Error

def call_stored_procedure(host_name, database_name, user_name, user_password, procedure_name, *args):
    """
    连接到MySQL数据库并调用存储过程

    :param host_name: 数据库的主机名
    :param database_name: 要连接的数据库名
    :param user_name: 数据库用户名
    :param user_password: 数据库用户密码
    :param procedure_name: 要调用的存储过程名
    :param args: 调用存储过程时传递的参数,使用可变参数列表接收
    :return: 存储过程的执行结果
    """
    try:
        # 连接到MySQL数据库
        connection = mysql.connector.connect(
            host=host_name,
            database=database_name,
            user=user_name,
            password=user_password
        )
        if connection.is_connected():
            cursor = connection.cursor(dictionary=True)
            
            # 调用存储过程
            # 注意:CALL 语句中的参数需要用 %s 占位,然后通过execute方法的第二个参数传入
            cursor.callproc(procedure_name, args)
            
            # 获取存储过程的输出参数(如果有的话)
            # 假设存储过程有一个OUT参数,你可以通过 cursor.description 来检查是否有输出参数
            # 并使用 cursor.fetchall() 来获取它们(但请注意,对于OUT参数,你可能需要使用cursor.fetchone())
            # 这里为了示例简单,我们假设没有输出参数,只是打印出受到影响的行数
            print(cursor.rowcount, "record(s) affected")
            
            # 如果需要,也可以获取存储过程内的SELECT语句的结果
            # result = cursor.fetchall()
            # for row in result:
            #     print(row)
            
            # 关闭cursor和connection
            cursor.close()
            connection.close()
            print("MySQL connection is closed")

    except Error as e:
        print("Error while connecting to MySQL", e)

# 示例用法
host_name = "localhost"
database_name = "your_database"
user_name = "your_username"
user_password = "your_password"
procedure_name = "your_procedure_name"
args = (arg1_value, arg2_value, ...)  # 根据你的存储过程需求传入参数

call_stored_procedure(host_name, database_name, user_name, user_password, procedure_name, *args)

请注意,你需要将`host_name`, `database_name`, `user_name`, `user_password`, `procedure_name`, 和 `args` 替换为你的实际数据库连接信息和存储过程信息。另外,`args` 是一个可变参数列表,它允许你传递任意数量的参数给存储过程。如果存储过程没有参数,你可以省略 `*args` 或传递一个空元组 `()`。

这个示例还假设你的存储过程可能会修改数据库中的数据,并打印出受影响的行数。如果你的存储过程还包含SELECT语句,并且你想获取这些SELECT语句的结果,你可以取消注释与结果获取相关的代码行。但是,请注意,如果存储过程同时包含OUT参数和SELECT语句,你可能需要更复杂的逻辑来分别处理它们。