当前位置: 代码网 > it编程>前端脚本>Python > Python实现调用MySQL数据库的存储过程

Python实现调用MySQL数据库的存储过程

2026年01月09日 Python 我要评论
一、准备工作首先需要安装 python 操作 mysql 的库,最常用的是 mysql-connector-python(官方库)或 pymysql,这里以官方库为例:pip install mysq

一、准备工作

首先需要安装 python 操作 mysql 的库,最常用的是 mysql-connector-python(官方库)或 pymysql,这里以官方库为例:

pip install mysql-connector-python

二、完整实现步骤

1. 先在 mysql 中创建测试存储过程

首先我们需要一个可测试的存储过程,比如创建一个根据用户 id 查询用户信息的存储过程:

-- 先创建测试表(可选)
create table if not exists users (
    id int primary key auto_increment,
    name varchar(50) not null,
    age int,
    email varchar(100)
);

-- 插入测试数据
insert into users (name, age, email) values 
('张三', 25, 'zhangsan@test.com'),
('李四', 30, 'lisi@test.com');

-- 创建存储过程:根据id查询用户信息
delimiter //  -- 临时修改语句结束符为//,避免与存储过程内的;冲突
create procedure get_user_by_id(in user_id int, out user_name varchar(50), out user_age int)
begin
    select name, age into user_name, user_age from users where id = user_id;
end //
delimiter ;  -- 恢复语句结束符为;

-- 另一个测试存储过程:无参数,查询所有用户
create procedure get_all_users()
begin
    select * from users;
end;

2. python 调用存储过程的代码实现

下面是 python 调用存储过程的完整代码,包含两种常见场景:带输入/输出参数的存储过程无参数的存储过程

import mysql.connector
from mysql.connector import error

def call_mysql_procedure():
    # 数据库连接配置
    config = {
        'host': 'localhost',       # 数据库地址
        'user': 'root',            # 用户名
        'password': '你的数据库密码', # 密码
        'database': 'test_db'      # 数据库名(替换为你的库名)
    }

    connection = none
    try:
        # 1. 建立数据库连接
        connection = mysql.connector.connect(**config)
        if connection.is_connected():
            cursor = connection.cursor()

            # ========== 场景1:调用带输入/输出参数的存储过程 ==========
            # 定义输入参数和输出参数
            user_id = 1  # 输入参数
            user_name = none  # 输出参数(初始化为none)
            user_age = none   # 输出参数(初始化为none)

            # 调用存储过程:callproc(存储过程名, (参数列表))
            cursor.callproc('get_user_by_id', (user_id, user_name, user_age))

            # 获取输出参数(存储过程执行后,参数会被更新,存在cursor.stored_results()中)
            for result in cursor.stored_results():
                # 或者直接通过 cursor.outputs 获取(不同版本可能略有差异)
                output_params = result.fetchone()
                if output_params:
                    user_name, user_age = output_params
            print(f"场景1 - 查询id为{user_id}的用户:")
            print(f"姓名:{user_name},年龄:{user_age}\n")

            # ========== 场景2:调用无参数的存储过程(返回结果集) ==========
            print("场景2 - 查询所有用户:")
            cursor.callproc('get_all_users')  # 无参数,传入空元组或省略
            # 遍历结果集
            for result in cursor.stored_results():
                users = result.fetchall()  # 获取所有结果
                # 打印表头
                columns = [desc[0] for desc in result.description]
                print("\t".join(columns))
                # 打印数据
                for user in users:
                    print("\t".join(str(col) for col in user))

            # 提交事务(如果存储过程有修改操作,必须提交)
            connection.commit()

    except error as e:
        print(f"数据库操作出错:{e}")
        # 出错时回滚事务
        if connection:
            connection.rollback()
    finally:
        # 关闭游标和连接
        if connection and connection.is_connected():
            if cursor:
                cursor.close()
            connection.close()
            print("\n数据库连接已关闭")

if __name__ == "__main__":
    call_mysql_procedure()

三、关键代码解释

1.连接数据库:通过 mysql.connector.connect() 传入配置参数建立连接,注意替换为你的数据库地址、用户名、密码和库名。

2.调用存储过程核心方法cursor.callproc(proc_name, params)

  • proc_name:存储过程名称(字符串)。
  • params:参数列表(元组),顺序需与存储过程的参数(in/out/inout)一一对应。

3.获取输出参数/结果集

  • 带输出参数的存储过程:执行 callproc 后,通过 cursor.stored_results() 遍历结果,获取输出参数的值。
  • 返回结果集的存储过程:同样通过 cursor.stored_results() 获取结果集,再用 fetchone()/fetchall() 读取数据。

4.事务处理:如果存储过程包含插入/更新/删除操作,必须调用 connection.commit() 提交事务;出错时用 connection.rollback() 回滚。

5.资源释放:最后必须关闭游标和连接,避免资源泄漏。

到此这篇关于python实现调用mysql数据库的存储过程的文章就介绍到这了,更多相关python调用mysql存储过程内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com