Python_pymysql
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
Python_pymysql的更多相关文章
- python爬虫与mysql,mongobd(1)(2)第一个视频python_pymysql 安装与使用类型,import解决 问题之模块引ru 就是解决你的问题
import pymysql.cursors ''' 1.创建连接 2.创建游标 3.执行sql 5.接受结果 ''' # 1.连接 connection =pymysql.Connect( # 域名 ...
- Python_PyMySQL数据库操作
连接数据库: conn=pymysql.connect(host=,user=',charset='utf8') 建立游标: cur = conn.cursor() 创建一个名字叫 lj 的数据库: ...
- 人生苦短_我用Python_pymysql库对Mysql数据库操作_009
# coding=utf-8 import pymysql ''' 数据库的登录信息: config={ 'host':'118.126.108.xxx', # :主机 'user':'python' ...
随机推荐
- JavaMail API 发送电子邮件
现在,我们对JavaMail API及其核心类有一个清晰的概念,现在让我们写这将发送简单的电子邮件,邮件带有附件,电子邮件,HTML内容和电子邮件内嵌图像一个简单的程序. 接着在上述所有情况的基本步骤 ...
- VC++ 2010 创建高级Ribbon界面详解(4)
5.辅助控件 除了前面我们介绍的按钮,工具栏,编辑框等基本控件外,为了支持现代软件对丰厚的界面交互方式的要求,Visual Studio 2010还提供了很多其他的辅助控件,例如我们通常会用到的“上一 ...
- NIO 源码分析(02-2) BIO 源码分析 Socket
目录 一.BIO 最简使用姿势 二.connect 方法 2.1 Socket.connect 方法 2.2 AbstractPlainSocketImpl.connect 方法 2.3 DualSt ...
- 如何发现 Redis 热点 Key ,解决方案有哪些?
Java技术栈 www.javastack.cn 优秀的Java技术公众号 来源:http://t.cn/EAEu4to 一.热点问题产生原因 热点问题产生的原因大致有以下两种: 1.1 用户消费的数 ...
- jsonp的实现原理
jsonp的实现原理 由于浏览器的安全性(同源策略)限制,不允许AJAX访问协议不同或域名不同或端口号不同的数据接口: 可以通过动态创建script标签的方式,把script标签的src属性指向数据接 ...
- C#跨线程访问(二)----thread参数、回调传参数
一.单个参数(封箱也可实现多参数) class B { public static void Main() { Thread t = new Thread(ne ...
- 笔记-ubuntu中/home下中文目录改英文
安装ubuntu后,如果选择的语言是中文,那/home下的文件夹会默认中文,在使用命令行的时候很不方便,此文记录切换成英文的方式,以便日后查看. 将目录重命名为英文 可以使用图形化界面,直接重命名 可 ...
- 多线程中join的解释(转)
文章来源:https://www.zhihu.com/question/61446671 这个join可以理解为“加入”,其含义与英语里面讲“Come on,join us”中的join类似.假设线程 ...
- H5新增的postMessage跨域解决方案Demo
Demo背景:html中使用iframe嵌入了跨域的vue项目,在html中将参数传入到跨越的vue项目中. 向跨越的子窗口中发送数据 function sendMessage(data) { // ...
- BlockingQueu 阻塞队列
java.util.concurrent public interface BlockingQueue<E> extends Queue<E> 简介 当阻塞队列插入数据时: 如 ...