Python 调用 MySQL 存储过程
在 Python 中调用 MySQL 存储过程,可以使用 mysql-connector-python 或 PyMySQL 等库,下面我将分别介绍这两种方法的实现方式。

使用 mysql-connector-python
安装库
pip install mysql-connector-python
调用存储过程示例
import mysql.connector
from mysql.connector import Error
def call_stored_procedure():
try:
# 连接数据库
connection = mysql.connector.connect(
host='localhost',
database='your_database',
user='your_username',
password='your_password'
)
if connection.is_connected():
cursor = connection.cursor()
# 调用无参数的存储过程
cursor.callproc('your_stored_proc_name')
# 调用带参数的存储过程
# cursor.callproc('your_stored_proc_name', (param1, param2))
# 获取结果
for result in cursor.stored_results():
for row in result.fetchall():
print(row)
except Error as e:
print(f"Error: {e}")
finally:
if connection.is_connected():
cursor.close()
connection.close()
call_stored_proc()
使用 PyMySQL
安装库
pip install pymysql
调用存储过程示例
import pymysql
def call_stored_procedure():
try:
# 连接数据库
connection = pymysql.connect(
host='localhost',
database='your_database',
user='your_username',
password='your_password',
cursorclass=pymysql.cursors.DictCursor
)
with connection.cursor() as cursor:
# 调用无参数的存储过程
cursor.callproc('your_stored_proc_name')
# 调用带参数的存储过程
# cursor.callproc('your_stored_proc_name', (param1, param2))
# 获取结果
results = cursor.fetchall()
for row in results:
print(row)
# 提交事务
connection.commit()
except Exception as e:
print(f"Error: {e}")
connection.rollback()
finally:
connection.close()
call_stored_proc()
处理带参数的存储过程
如果存储过程有参数,可以这样调用:
# 假设存储过程定义为: PROCEDURE get_user_by_id(IN user_id INT, OUT user_name VARCHAR(100))
cursor.callproc('get_user_by_id', (123,)) # 123是输入参数,第二个参数是输出变量
# 获取输出参数
results = cursor.stored_results()
for result in results:
# 第一个结果集是查询结果
print("Query results:", result.fetchall())
# 获取输出参数的值
cursor.execute("SELECT @_get_user_by_id_1") # @_procname_N,N是参数位置(从1开始)
output_param = cursor.fetchone()[0]
print("Output parameter:", output_param)
注意事项
- 确保存储过程在数据库中已存在
- 根据存储过程的参数类型(IN, OUT, INOUT)正确传递参数
- 处理结果集时,存储过程可能返回多个结果集
- 调用完成后记得关闭连接
- 对于事务操作,记得调用
commit()或rollback()
完整示例(带参数和返回值)
import mysql.connector
def call_stored_proc_with_params():
try:
conn = mysql.connector.connect(
host='localhost',
database='test_db',
user='root',
password='password'
)
cursor = conn.cursor()
# 调用存储过程,传入一个输入参数,获取一个输出参数
cursor.callproc('add_user', ('john_doe', 30, 0)) # 第三个参数是输出变量
# 获取输出参数
cursor.execute("SELECT @_add_user_2")
output = cursor.fetchone()[0]
print(f"New user ID: {output}")
# 获取结果集(如果有)
for result in cursor.stored_results():
print("Result set:", result.fetchall())
except Error as e:
print(f"Error: {e}")
finally:
if conn.is_connected():
cursor.close()
conn.close()
call_stored_proc_with_params()
就是在 Python 中调用 MySQL 存储过程的基本方法,根据你的具体需求,可能需要调整参数处理和结果获取的方式。
