【python】mysql中pymysql模块详解(一)

pymysql是纯用Python操作MySQL的模块,其使用方法和MySQLdb几乎相同。此次介绍mysql以及在python中如何用pymysql操作数据库, 以及在mysql中存储过程, 触发器以及事务的实现, 对应到pymysql中应该如何操作。

数据库:

这里写图片描述

1、执行SQL

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’,否则中文显示乱码。

2、获取查询数据

  • 使用 cursor.fetchone( ) 获取剩余结果的第一行数据
  • 使用 cursor.fetchmany( )获取剩余结果的前N数据
  • 使用 cursor.fetchall( ) 获取剩余结果的前N数据
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'))

3、获取新创建数据自增ID

可以获取到最新自增的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)

4、移动游标

操作都是靠游标,那对游标的控制也是必须的

注:在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') #从第二个当前的位置移动两个单位后,即第五个

5、fetch数据类型

关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即通过游标设定参数
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'}

6、调用存储过程

  • 存储过程(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)来进行调用,变量前面要加@。

  1. 调用无参存储过程
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()

猜你喜欢

转载自blog.csdn.net/brucewong0516/article/details/80324052