一 存储过程
一 存储过程介绍
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql
使用存储过程的优点:
#1. 用于替代程序写的SQL语句,实现程序与sql解耦 #2. 基于网络传输,传别名的数据量小,而直接传sql数据量大
使用存储过程的缺点:
#1. 程序员扩展功能不方便
补充:程序与数据库结合使用的三种方式
#方式一:
MySQL:存储过程
程序:调用存储过程
#方式二:
MySQL:
程序:纯SQL语句
#方式三:
MySQL:
程序:类和对象,即ORM(本质还是纯SQL语句)
二 创建简单存储过程(无参)
delimiter // create procedure p1() BEGIN select * from score; END // delimiter ; #在mysql中调用 call p1() #在python中基于pymysql调用 cursor.callproc(‘p1‘) print(cursor.fetchall())
mysql> use cmz; Database changed mysql> show tables; +---------------+ | Tables_in_cmz | +---------------+ | class | | class_grade | | course | | score | | student | | teacher | | teacher2cls | +---------------+ 7 rows in set (0.00 sec) mysql> delimiter // # 表示sql语句的结束是// 而不是; mysql> create procedure p1() -> BEGIN -> select * from score; -> END // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; # 还原sql语句的结束标志位; mysql> call p1(); # 调用存储过程 +-----+------------+-----------+-------+ | sid | student_id | course_id | score | +-----+------------+-----------+-------+ | 1 | 1 | 1 | 60 | | 2 | 1 | 2 | 59 | | 3 | 2 | 2 | 59 | | 4 | 3 | 2 | 80 | +-----+------------+-----------+-------+ 4 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
pycharm下调用存储过程
#!/usr/bin/env python # _*_ coding: utf-8 _*_ import pymysql # 建立连接 conn = pymysql.connect( host="127.0.0.1", port=3306, user="cmz", passwd="cmz", db="cmz", # 建有存储过程的库 charset="utf8" ) # 拿到游标 cursor = conn.cursor() cursor.callproc("p1") # 调用存储过程,p1 位存储过程名字 print(cursor.fetchall()) # 拿到数据 cursor.close() conn.close()
结果是
C:\Python35\python.exe D:mysql模块之存储过程.py ((1, 1, 1, 60), (2, 1, 2, 59), (3, 2, 2, 59), (4, 3, 2, 80))
结果和在终端上一致
三 创建存储过程(有参)
对于存储过程,可以接收参数,其参数有三类: #in 仅用于传入参数用 #out 仅用于返回值用 #inout 既可以传入又可以当作返回值
mysql> delimiter // mysql> create procedure p2(in n1 int,in n2 int,out res int) -> BEGIN -> select * from score where course_id=n1 and score >n2 ; -> set res = 1; -> END // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> set @x=0; Query OK, 0 rows affected (0.00 sec) mysql> call p2(2,60,@x); # 在mysql中调用 +-----+------------+-----------+-------+ | sid | student_id | course_id | score | +-----+------------+-----------+-------+ | 4 | 3 | 2 | 80 | +-----+------------+-----------+-------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) mysql> select @x; # 查看执行后的结果 +------+ | @x | +------+ | 1 | +------+ 1 row in set (0.00 sec)
在pycharm中
import pymysql # 建立连接 conn = pymysql.connect( host="127.0.0.1", port=3306, user="cmz", passwd="cmz", db="cmz", charset="utf8" ) # 拿到游标 cursor = conn.cursor() cursor.callproc(‘p2‘,(2,60,0)) # 在python中基于pymysql调用,0 相当于set @x=0 print(cursor.fetchall()) cursor.execute("select @_p2_2") # @_p2_0=2 表示第一个参数,@_p2_1=60 表示第二个参数,@_p2_2=0表示第三个参数 print(cursor.fetchall()) # 查询select查询结果 cursor.close() conn.close()
结果
C:\Python35\python.exe D:MySQL/mysql模块之存储过程.py ((4, 3, 2, 80),) ((1,),)
应用程序与数据库结合使用
方式1:
python: 调用存储过程
MySQL: 编写存储过程
方式2:
Python 编写纯生SQL
MySQL
方式3:
Python ORM->纯生SQL
MySQL