Python实现调用MySQL数据库的存储过程
首先需要安装 Python 操作 MySQL 的库最常用的是mysql-connector-python官方库或pymysql这里以官方库为例1pipinstallmysql-connector-python二、完整实现步骤1. 先在 MySQL 中创建测试存储过程首先我们需要一个可测试的存储过程比如创建一个根据用户 ID 查询用户信息的存储过程1234567891011121314151617181920212223242526-- 先创建测试表可选CREATETABLEIFNOTEXISTS users (idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50)NOTNULL,ageINT,emailVARCHAR(100));-- 插入测试数据INSERTINTOusers (name, age, email)VALUES(张三, 25,zhangsantest.com),(李四, 30,lisitest.com);-- 创建存储过程根据ID查询用户信息DELIMITER //-- 临时修改语句结束符为//避免与存储过程内的;冲突CREATEPROCEDUREget_user_by_id(INuser_idINT,OUTuser_nameVARCHAR(50),OUTuser_ageINT)BEGINSELECTname, ageINTOuser_name, user_ageFROMusersWHEREid user_id;END//DELIMITER ;-- 恢复语句结束符为;-- 另一个测试存储过程无参数查询所有用户CREATEPROCEDUREget_all_users()BEGINSELECT*FROMusers;END;2. Python 调用存储过程的代码实现下面是 Python 调用存储过程的完整代码包含两种常见场景带输入/输出参数的存储过程、无参数的存储过程1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768importmysql.connectorfrommysql.connectorimportErrordefcall_mysql_procedure():# 数据库连接配置config{host:localhost,# 数据库地址user:root,# 用户名password:你的数据库密码,# 密码database:test_db# 数据库名替换为你的库名}connectionNonetry:# 1. 建立数据库连接connectionmysql.connector.connect(**config)ifconnection.is_connected():cursorconnection.cursor()# 场景1调用带输入/输出参数的存储过程 # 定义输入参数和输出参数user_id1# 输入参数user_nameNone# 输出参数初始化为Noneuser_ageNone# 输出参数初始化为None# 调用存储过程callproc(存储过程名, (参数列表))cursor.callproc(get_user_by_id, (user_id, user_name, user_age))# 获取输出参数存储过程执行后参数会被更新存在cursor.stored_results()中forresultincursor.stored_results():# 或者直接通过 cursor.outputs 获取不同版本可能略有差异output_paramsresult.fetchone()ifoutput_params:user_name, user_ageoutput_paramsprint(f场景1 - 查询ID为{user_id}的用户)print(f姓名{user_name}年龄{user_age}\n)# 场景2调用无参数的存储过程返回结果集 print(场景2 - 查询所有用户)cursor.callproc(get_all_users)# 无参数传入空元组或省略# 遍历结果集forresultincursor.stored_results():usersresult.fetchall()# 获取所有结果# 打印表头columns[desc[0]fordescinresult.description]print(\t.join(columns))# 打印数据foruserinusers:print(\t.join(str(col)forcolinuser))# 提交事务如果存储过程有修改操作必须提交connection.commit()exceptError as e:print(f数据库操作出错{e})# 出错时回滚事务ifconnection:connection.rollback()finally:# 关闭游标和连接ifconnectionandconnection.is_connected():ifcursor: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.资源释放最后必须关闭游标和连接避免资源泄漏。