pymysql是纯用Python操作MySQL的模块,其使用方法和MySQLdb几乎相同。此次介绍mysql以及在python中如何用pymysql操作数据库, 以及在mysql中存储过程, 触发器以及事务的实现, 对应到pymysql中应该如何操作。
import numpy as np
import pandas as pd
from pandas import DataFrame,Series
import pymysql
import pymysql.cursors
#---------------------数据连接---------------------------#
def connection(database_key):
mysql = {'host': '', 'port': 3306, 'user': 'root', 'passwd': '', 'db': '', 'charset': 'utf8'}
if database_key == 'test':
mysql['host'] = 'localhost'
mysql['passwd'] = '123456'
mysql['db'] = 'mytest'
return mysql
# 创建连接
conn = pymysql.connect(**connection('test'))
# 创建游标
cursor = conn.cursor()
# 执行SQL,并返回收影响行数
effect_row = cursor.execute("select * from user3")
print(cursor.fetchone())
# 执行SQL,并返回受影响行数
effect_row = cursor.execute("update user3 set name='ss' where symbol = 2")
print(effect_row)
# 执行SQL,并返回受影响行数,执行多次
effect_row = cursor.executemany("insert into user3(symbol,name) values(%s,%s)", [(20,"kloh"),(40,'bolo')])
print(effect_row)
#提交,不然无法保存新建或者修改的数据
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
输出:
(2, '99', 'hh')
0
2
注意:存在中文的时候,连接需要添加charset=’utf8’,否则中文显示乱码。
import numpy as np
import pandas as pd
from pandas import DataFrame,Series
import pymysql
import pymysql.cursors
#---------------------数据连接---------------------------#
def connection(database_key):
mysql = {'host': '', 'port': 3306, 'user': 'root', 'passwd': '', 'db': '', 'charset': 'utf8'}
if database_key == 'test':
mysql['host'] = 'localhost'
mysql['passwd'] = '123456'
mysql['db'] = 'mytest'
return mysql
# 创建连接
conn = pymysql.connect(**connection('test'))
# 创建游标
cursor = conn.cursor()
# 执行SQL,并返回收影响行数
effect_row = cursor.execute("select * from user3")
print('获取剩余结果的第一行数据{}'.format(cursor.fetchone()))
print('获取剩余结果的前N行数据{}'.format(cursor.fetchmany(2)))
print('获取剩余结果的全部数据{}'.format(cursor.fetchall()))
# 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update user3 set name='ss' where symbol = 2")
#print(effect_row)
# 执行SQL,并返回受影响行数,执行多次
#effect_row = cursor.executemany("insert into user3(symbol,name) values(%s,%s)", [(20,"kloh"),(40,'bolo')])
#print(effect_row)
#提交,不然无法保存新建或者修改的数据
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
输出:
获取剩余结果的第一行数据(2, '99', 'hh')
获取剩余结果的前N行数据((5, '2', 'ss'), (9, '99', 'hh'))
获取剩余结果的全部数据((10, '10', 'th'), (11, '20', 'kloh'), (12, '40', 'bolo'), (13, '20', 'kloh'), (14, '40', 'bolo'))
可以获取到最新自增的ID,也就是最后插入的一条数据ID
import numpy as np
import pandas as pd
from pandas import DataFrame,Series
import pymysql
import pymysql.cursors
#---------------------数据连接---------------------------#
def connection(database_key):
mysql = {'host': '', 'port': 3306, 'user': 'root', 'passwd': '', 'db': '', 'charset': 'utf8'}
if database_key == 'test':
mysql['host'] = 'localhost'
mysql['passwd'] = '123456'
mysql['db'] = 'mytest'
return mysql
# 创建连接
conn = pymysql.connect(**connection('test'))
# 创建游标
cursor = conn.cursor()
effect_row = cursor.executemany("insert into user3(symbol,name) values(%s,%s)",[(99,'keck'),(80,'jone')])
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
new_id = cursor.lastrowid
print(new_id)
操作都是靠游标,那对游标的控制也是必须的
注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
cursor.scroll(1,mode='relative') # 相对当前位置移动
cursor.scroll(2,mode='absolute') # 相对绝对位置移动
实例:
#---------------------数据连接---------------------------#
def connection(database_key):
mysql = {'host': '', 'port': 3306, 'user': 'root', 'passwd': '', 'db': '', 'charset': 'utf8'}
if database_key == 'test':
mysql['host'] = 'localhost'
mysql['passwd'] = '123456'
mysql['db'] = 'mytest'
return mysql
# 创建连接
conn = pymysql.connect(**connection('test'))
# 创建游标
cursor = conn.cursor()
#effect_row = cursor.executemany("insert into user3(symbol,name) values(%s,%s)",[(99,'keck'),(80,'jone')])
effect_row = cursor.execute("select * from user3")
cursor.scroll(1,mode = 'absolute') # 相对绝对位置移动
print(cursor.fetchone())
cursor.scroll(2,mode = 'relative') # 相对当前位置移动
print(cursor.fetchone())
# 提交,不然无法保存新建或者修改的数据
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
输出结果:
(5, '2', 'ss') #从初始绝对位置开始,移动一个单位的结果,即第二个
(11, '20', 'kloh') #从第二个当前的位置移动两个单位后,即第五个
关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即通过游标设定参数
cursor=pymysql.cursors.DictCursor:
#---------------------数据连接---------------------------#
def connection(database_key):
mysql = {'host': '', 'port': 3306, 'user': 'root', 'passwd': '', 'db': '', 'charset': 'utf8'}
if database_key == 'test':
mysql['host'] = 'localhost'
mysql['passwd'] = '123456'
mysql['db'] = 'mytest'
return mysql
# 创建连接
conn = pymysql.connect(**connection('test'))
# 创建游标,游标设为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#effect_row = cursor.executemany("insert into user3(symbol,name) values(%s,%s)",[(99,'keck'),(80,'jone')])
effect_row = cursor.execute("select * from user3")
cursor.scroll(1,mode = 'absolute') # 相对绝对位置移动
print(cursor.fetchone())
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
输出结果:
{'id': 5, 'symbol': '2', 'name': 'ss'}
存储过程(stored procedure)
存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就是将sql执行过程存储在数据库中,来方便提取)。
优点:1.多次提取,减少编译时间,2.因为每次提取都需要传入sql语句,如果用存储过程名来调用的话,就减少了访问流量3.增加了重用(可以相较之与(函数对编程的影响))
缺点:1.存储过程将会占用内存空间,并且复杂的过程操作需要一定的cpu 2.存储过程难以调试,如果存储过程太过复杂,不有利于业务逻辑3.存储过程高级,难以维护
DELIMITER $$ // 设置注释
CREATE PROCEDURE CountOrderByStatus(
IN orderStatus VARCHAR(25), //需要给定存入使用的参数
OUT total INT) //需要给定输出的参数
BEGIN
SELECT count(orderNumber)
INTO total
FROM orders
WHERE status = orderStatus;
END$$
DELIMITER ;
这个存储过程接受两个过程参数 一个是输入参数orderStatus,另一个是输出参数 total 最后可以使用Call CountOrderByStatus(‘23’,@title)来进行调用,变量前面要加@。
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='tkq1')
#游标设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#无参数存储过程
cursor.callproc('p2') #等价于cursor.execute("call p2()")
row_1 = cursor.fetchone()
print(row_1)
conn.commit()
cursor.close()
conn.close()
2 . 调用有参存储过程
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='tkq1')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.callproc('p1', args=(1, 22, 3, 4))
#获取执行完存储的参数,参数@开头
cursor.execute("select @p1,@_p1_1,@_p1_2,@_p1_3") #{u'@_p1_1': 22, u'@p1': None, u'@_p1_2': 103, u'@_p1_3': 24}
row_1 = cursor.fetchone()
print(row_1)
conn.commit()
cursor.close()
conn.close()