使用Python处理MySQL逻辑时如果把SQL语句直接写在字符串中调用多次运行需要多次编译而且代码维护难度增加,MySQL存储过程将SQL逻辑封装解决这个问题,下面记录一下测试效果。
创建测试存储过程
delimiter $$
DROP PROCEDURE IF EXISTS `add_person`$$
CREATE PROCEDURE `add_person`(IN p_id int,p_name VARCHAR(50),p_etl_date VARCHAR(50))
BEGIN
INSERT into ods_person(id,`name`,etl_dat)
VALUES(p_id,p_name,p_etl_date);
END$$
delimiter ;
MySQL测试
SELECT * FROM ods_person;
调用存储过程
call add_person(9,'Kobe','2020-04-15');
结果:
python调用:
import MySQLdb
mysqlCon = MySQLdb.connect(host='172.18.0.1',user='root',passwd='root',db='test',port=3306,charset='utf8')
mysqlCur = mysqlCon.cursor()
sql = 'select * from ods_person'
# 提交参数时要是用元祖即使只有一个参数也需要使用(a,)
mysqlCur.callproc('add_person',(13,'Curry','2020-04-15'))
# 需要commit否则不会执行
mysqlCon.commit()
mysqlCur.execute(sql)
print mysqlCur.fetchall()
mysqlCur.close()
mysqlCon.close()
以上操作需要注意的是传参使用元祖,和commit。