pymysql模块使用————(实操)
该软件包包含一个纯Python MySQL客户端库。PyMySQL的目标是成为MySQLdb的替代品,并在CPython,PyPy和IronPython上工作。
注:PyMySQL不支持低级别的API _mysql提供了像data_seek, store_result和use_result。您应该使用PEP 249中定义的高级API 。但是支持一些API,如自动提交和ping,因为PEP 249不包含他们的用例。
要求
- Python - 以下之一:
- CPython:2.7和> = 3.4
- PyPy:最新版本
- MySQL服务器 - 以下之一:
- MySQL > = 5.5
- MariaDB > = 5.5
安装
Package上传到PyPI。
你也可以用pip安装它:
pip3 install pymysql
安装完成之后即可使用了。我们先看看官方的示例:
一.创建一个SQL表
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) COLLATE utf8_bin NOT NULL,
`password` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_binAUTO_INCREMENT=1 ;
二.python使用实例:
import pymysql.cursors
# 连接到数据库
connection = pymysql.connect(host='localhost',
user='root',
password='123',
db='books',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
# 插入新的数据
sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
cursor.execute(sql, ('webmaster@python.org', 'very-secret'))
# 默认情况下,连接不是自动提交。所以你必须自行保存好
connection.commit()
with connection.cursor() as cursor:
# 读取单个记录
sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
cursor.execute(sql, ('webmaster@python.org',))
result = cursor.fetchone()
print(result)
finally:
connection.close()
执行后的结果:
说明:这里是以字典为返回结果
一、学习实例操作
实例一:实现:使用Python实现用户登录,如果用户存在则登录成功(假设该用户已在数据库中)
import pymysql
user = input('请输入用户名:')
pwd = input('请输入密码:')
#1.连接
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='123',
db = 'dbtest',
charset='utf8'
)
#2.创建游标
cursor = conn.cursor()
###注意%s需要加引号
sql = "select * from db2 where username = '{}' and password='{}' ".format(user,pwd)
print(sql)
#3.执行sql语句
cursor.execute(sql)
result=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
print(result)
#4.关闭连接,游标和连接都要关闭
cursor.close()
conn.close()
if result:
print('登录成功!')
else:
print('登录失败!')
执行后的结果:
二、execute()之sql注入
这里只截图演示三种SQL注入示例截图
1
2
3
解决方法:
# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(username,pwd)
# print(sql)
# result=cursor.execute(sql)
#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
result=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
三、增、删、改:conn.commit()
commit()方法:在数据库里增,删,改的时候。必须要进行提交,否则插入的时候数据不生效
import pymysql
username = input('请输入用户名:')
pwd = input('请输入密码:')
#1.连接
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='123',
db='dbtest',
charset='utf8'
)
#2.创建游标
cursor = conn.cursor()
#操作
#增
# sql = "insert into db2(username,password) values (%s,%s)"
#
# effect_row = cursor.execute(sql,(username,pwd))
# #同时插入多条数据
# cursor.executemany(sql,[('lisi','110'),('wangwu','119')])
# print(effect_row)
#改
# sql = "update db2 set username = %s where id = 2"
# effect_row=cursor.execute(sql,username)
# print(effect_row)
#删
# sql = "delete from db2 where id =n 2"
# effect_row = cursor.execute(sql,username)
# print(effect_row)
#一定记得commit
conn.commit()
# 4.关闭游标
cursor.close()
四、查:fetchone、fetchmany、fetchall
fetchone():获取下一行数据,第一次为首行;
fetchall():获取所有行数据源
fetchmany(4):获取4行数据
使用fetchone()
import pymysql
#1.连接
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password ='123',
db='dbtest',
charset='utf8'
)
#2.创建游标
cursor = conn.cursor()
sql = 'select * from db2'
cursor.execute(sql)
#3.查询数据
row = cursor.fetchone()
print(row)
#查询第二行数据
row = cursor.fetchone()
print(row)
#4.关闭游标
cursor.close()
#5.关闭连接
conn.close()
执行后输出的结果:
使用fetchall()
import pymysql
#1.连接
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='123',
db = 'dbtest',
charset='utf8'
)
#2.创建游标
cursor = conn.cursor()
sql = 'select * from db2'
cursor.execute(sql)
#3.获取所有的数据
rows = cursor.fetchall()
print(rows)
#4.关闭游标
cursor.close()
#5.关闭连接
conn.close()
执行后输出结果:
使用fetchall()
import pymysql
#1.连接
conn = pymysql.connect(
host = 'localhost',
port=3306,
user = 'root',
password = '123',
db = 'dbtest',
charset = 'utf8'
)
#2.创建游标
cursor = conn.cursor()
sql = 'select * from db2'
cursor.execute(sql)
#3.获取数据
rows = cursor.fetchall()
print(rows)
#4.关闭游标
cursor.close()
#5.关闭连接
conn.close()
执行输出结果:
默认情况下,我们获取到的返回值是元祖,只能看到每行的数据,却不知道每一列表的是什么,这个时候可以使用以下方式来返回字典,每一行的数据都会生成一个字典:
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #在实例化的时候,将属性cursor设置为pymysql.cursors.DictCursor
在fetchone示例中,在获取数据的时候,可以理解开始的时候,有一个行指针指着第一行的上方,获取一行,它就向下移动一行,所以当行指针到最后一行的时候,就不能在获取到行的内容,所以我们可以使用如下方法来移动行指针:
cursor.scroll(1,mode='relative') #相对当前位置移动
cursor.scroll(2,mode='absolute') #相对绝对位置移动
第一个值为移动的行动,整数为向下移动,负数为向下移动,mode指定了是相对当前位置移动,还是相对于行首移动
用户登录实例二:
import pymysql
#1.连接
conn = pymysql.connect(
host = 'localhost',
port = 3306,
user = 'root',
password = '123',
db = 'dbtest',
charset = 'utf8'
)
#2.创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'select * from db2'
cursor.execute(sql)
#3.查询数据
# 查询第一行的数据
row = cursor.fetchone()
print(row)
# 查询第二行数据
row = cursor.fetchone()
print(row)
cursor.scroll(-1,mode='relative') #设置之后,光标相对当前位置往前移动了一行,所以打印的结果为第二行的数据
row = cursor.fetchone()
print(row)
cursor.scroll(-1,mode='relative') #设置之后,光标相对于行首没有任何,所以打印的结果为第一行数据
row = cursor.fetchone()
print(row)
#4.关闭游标
cursor.close()
#5.关闭连接
conn.close()
执行输出结果:
fetchmany()
import pymysql
# 1.连接
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='123',
db='dbtest',
charset='utf8')
# 2.创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'select * from db2'
cursor.execute(sql)
# 获取2条数据
rows = cursor.fetchmany(2)
print(rows)
# 4.关闭游标
# rows = cursor.fetchall()
# print(rows)
cursor.close()
# 5.关闭连接
conn.close()
执行输出:
转载于:https://blog.51cto.com/haowen/2129507