该软件包包含一个纯Python MySQL客户端库。PyMySQL的目标是成为MySQLdb的替代品,并在CPython,PyPy和IronPython上工做。python
注:PyMySQL不支持低级别的API _mysql提供了像data_seek, store_result和use_result。您应该使用PEP 249中定义的高级API 。可是支持一些API,如自动提交和ping,由于PEP 249不包含他们的用例。mysql
Python - 如下之一:web
MySQL服务器 - 如下之一:服务器
Package上传到PyPI。fetch
你也能够用pip安装它:spa
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('登陆失败!')
执行后的结果:
这里只截图演示三种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的规矩来。
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():获取下一行数据,第一次为首行; 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()
执行输出: