pymysql安装:pip3 install pymysql

  第一个实例:连接数据库进行用户验证

条件:数据库中已存在一个用户表,包含用户名、密码

import pymysql
user = input("username:")
pwd = input("password:")
# 连接数据库,只是打开数据库
db = pymysql.connect(host='localhost',
              user='root',
              password='',
              database='userinfo', # 所用的数据库名
              charset = 'utf-8') # host 数据库所在主机位置
cursor = db.cursor() # 游标,通过游标查询进行对数据库的操作,from 后是所用的表名
sql = "select * from user_pwd where username = '%s' and password = '%s'"%(user,pwd) # 这里是运用的是字符串替换
cursor.execute(sql) # 在数据库中通过语句查询
data = cursor.fetchone() # 查询结果运用fetchall() 把结果拿出来
cursor.close() # 关闭游标的使用
db.close() # 关闭数据库
if data:
print("登陆成功")
else:
print("登陆失败")

在数据库操作中,字符串替换的操作方式,可能会遇见数据注入,何为数据注入?

例:当把用户名输入: uu' 1=1 --

若遇见这个情况

sql = "select * from user_pwd where username = '%s' and password = '%s'"%(user,pwd)

字符串替换后

sql = "select * from user_pwd where username = 'uu' or 1=1 --' and password = '%s'"

# (这里的-- 在数据库中表示的是注释的意思),所以 用户名username = uu,1=1 绝对成立,所以就绕过了用户验证直接验证成功!!   这就是数据注入!!

在pymysql 中 .execute() 函数对数据替换进行了相关处理,可直接用此函数进行字符替换,所以实例应写为:

import pymysql
user = input("username:")
pwd = input("password:")
# 连接数据库,只是打开数据库
db = pymysql.connect(host='localhost', user='root',password='', database='userinfo') # host 数据库所在主机位置
cursor = db.cursor() # 游标
sql = "select * from user_pwd where username = %s and password = %s"
cursor.execute(sql,(user,pwd)) # 这里不能是%,或者.format()的字符串替换,利用,可进行correctly转义,从而避免sql注入的发生
# cursor.execute(sql,[user,pwd]) # 另一种写法
#第三种写法
# sql = "select * from user_pwd where username = %(u)s and password = %(p)s"
#cursor.execute(sql,{'u':user,'p':pwd})
data = cursor.fetchone() # 查询结果
cursor.close()
db.close()
if data:
print("登陆成功")
else:
print("登陆失败")
  pymysql的增删改

注:增删改都需要sql语句提交:conn.commit()

一、增加

1.基础版

import pymysql
db = pymysql.connect(host='localhost', user='root',password='', database='userinfo') # host 数据库所在主机位置
cursor = db.cursor() # 游标
sql = "insert into user_pwd(username,password) values('vera', '1234')" # 其中数据库中id为自增序列,否则报错
cursor.execute(sql)
print(cursor.lastrowid) # 这里得到的是数据库中自增id的id值 db.commit() # 只要要修改表中的数据,都必须commit提交sql语句
cursor.close()
db.close()

2.一级进阶版:手动输入用户名、密码

import pymysql
user = input('username:')
pwd = input('password:')
db = pymysql.connect(host='localhost', user='root',password='', database='userinfo') # host 数据库所在主机位置
cursor = db.cursor() # 游标
sql = "insert into user_pwd(username,password) values(%s,%s)"
cursor.execute(sql,(user,pwd)) # 手动输入用户名,密码 # 有一个返回值:受影响的行数(1行) db.commit() # 只要要修改表中的数据,都必须commit提交sql语句
cursor.close()
db.close()

3.二级进阶:输入两个用户名、密码同时插入数据库(运用:cursor.executemany()函数)

import pymysql

db = pymysql.connect(host='localhost', user='root',password='', database='userinfo')   # host 数据库所在主机位置
cursor = db.cursor() # 游标
# sql = "insert into user_pwd(username,password) values(%s,%s)"
# cursor.execute(sql,(user,pwd)) sql = "insert into user_pwd(username,password) values(%s,%s)"
cursor.executemany(sql,[('guan_guan',''),('you_you','')]) # 有一个返回值:受影响的行数
print(cursor.lastrowid) # 这里拿到的id值为插入数据的最后一个id的id值
db.commit() # 只要要修改表中的数据,都必须commit提交sql语句
cursor.close()
db.close()

删除和修改同上(除sql语句不同)

  pymysql 的查

主要是数据查到的条数不同有不同的函数

1.fetch系列

import pymysql

db = pymysql.connect(host='localhost', user='root',password='', database='userinfo')   # host 数据库所在主机位置
cursor = db.cursor() # 游标
sql = "select * from user_pwd"
cursor.execute(sql) # 只取查询到的第一条
# data = cursor.fetchone() # 查询结果
# 表示这是游标指针进行的查询
# data = cursor.fetchone() # (配合上一条一起)查询结果从2开始
# 取查询到的指定条数的查询结果 # data = cursor.fetchmany(3) # 取查询到的全部结果 data = cursor.fetchall() print(data) cursor.close() db.close()

2.指定位置开始打印结果

cursor.scroll(2,mode='relative')  # 相对当前位置移动
# cursor.scroll(3,mode='absolute') # 相对绝对位置移动
第一个值为移动的行动,整数为向下移动,负数为向下移动,mode指定了是相对当前位置移动,还是相对于行首移动
import pymysql

db = pymysql.connect(host='localhost', user='root',password='', database='userinfo')   # host 数据库所在主机位置
cursor = db.cursor() # 游标
sql = "select * from user_pwd"
cursor.execute(sql) # 指定位置开始查询
cursor.scroll(2,mode='relative') # 相对当前位置移动
# cursor.scroll(3,mode='absolute') # 相对绝对位置移动 # 只取查询到的第一条
data = cursor.fetchone() # 查询结果 print(data)
cursor.close()
db.close()

3.利用pymysql.cursors.DictCursor参数返回字典便于查看

import pymysql

db = pymysql.connect(host='localhost', user='root',password='', database='userinfo')   # host 数据库所在主机位置
cursor = db.cursor(cursor=pymysql.cursors.DictCursor) # 游标,默认cursor=None
sql = "select * from user_pwd"
cursor.execute(sql) # 取查询到的全部结果
data = cursor.fetchall()
print(data) # 打印的为列表中有字典便于查看
cursor.close()
db.close()

例子所用数据库:https://files.cnblogs.com/files/Vera-y/myemployees.zip

最新文章

  1. mysql代码执行漏洞
  2. stm32 按键
  3. iOS应用程序的生命周期
  4. JS eval() 特殊用法
  5. LightOJ1417 Forwarding Emails(强连通分量+缩点+记忆化搜索)
  6. SharePoint自动化系列——Add/Remove “Hold” from items
  7. Maven的几个核心概念
  8. MinGW编译wxWidgets中的问题及解决方法
  9. Linux基础教程之/dev/null和/dev/zero的区别及其用法
  10. DropDownList绑定数据
  11. 解决android TextView多行文本(超过3行)使用ellipsize属性无效问题
  12. 用XCA(X Certificate and key management)可视化程序管理SSL 证书(2)--生成SSL证书请求
  13. Dev中GridControl的导出Excel设置
  14. ES6 promise学习
  15. vue重温之mint-ui------------点击事件绑定
  16. 团队-爬取豆瓣Top250电影-团队-阶段互评
  17. 在Django中接收文件并存储
  18. Django的路由层
  19. WIN7无法访问共享打印机及文件的解决办法
  20. 【Linux】Centos6.8下一键安装Lamp环境

热门文章

  1. spring boot下WebSocket消息推送
  2. 用scala 实现top N 排名
  3. 「SNOI2019」通信 分治优化费用流建图
  4. CSS标准的书写顺序
  5. 多flavor导致的源码依赖问题-- Cannot choose between the following configurations of project :sample:
  6. python_django_静态文件
  7. node 模板引擎使用的步奏
  8. jq-demo-点击改变图片
  9. shell脚本将命令的结果赋值给变量的2种写法
  10. Redis探索之路(四):Redis的五种数据类型Set和ZSet