day 7-21 pymysql模块
一、安装的两种方法
第一种:
#安装
pip3 install pymysql
第二种:
二、链接,执行sql,关闭(游标)
import pymysql user = input("username:").strip()
pwd = input("password:").strip() #1.先建立连接,然后拿到游标
conn=pymysql.connect(host="localhost",user="root",password="",
database="db7",charset="utf8" )
cursor =conn.cursor() #拿到游标 #2.执行sql sql = "select * from user where name='%s' and password = '%s';"%(user,pwd)
print(sql) rows = cursor.execute(sql) #拿到受影响的行数
print(rows)
#3.关闭游标
cursor.close()
#4.关闭连接
conn.close() if rows:
print("登录成功")
else:
print("登录失败")
三、execute()之sql注入
注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符
根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'
最后那一个空格,在一条sql语句中如果遇到select *
from t1 where id > 3 -- and name='jack';则--之后的条件被注释掉了 #1、sql注入之:用户存在,绕过密码
jack' -- 任意字符 #2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符
解决注入
# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# rows=cursor.execute(sql) #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s
and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
rows=cursor.execute(sql,[user,pwd])
#pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
#2.防止注入 import pymysql user = input("username:").strip()
pwd = input("password:").strip() #1.先建立连接,然后拿到游标
conn=pymysql.connect(host="localhost",user="root",password="",
database="db7",charset="utf8" )
cursor =conn.cursor() #拿到游标 #2.执行sql sql = "select * from user where name=%s and password = %s;"
print(sql) rows = cursor.execute(sql,[user,pwd]) #在这里传入参数
print(rows)
#3.关闭游标
cursor.close()
#4.关闭连接
conn.close() if rows:
print("登录成功")
else:
print("登录失败")
防止注入
四、增、删、改:conn.commit()
增:
import pymysql # 1.连接拿到游标
conn=pymysql.connect(host="localhost",user="root",password="",
database="db7",charset="utf8"
)
cursor=conn.cursor() # 拿到游标,即mysql> # 2.执行sql
sql='insert into user (name,age,password) values(%s,%s,%s);'
print(sql)
# 2.1插入单条记录
# rows = cursor.execute(sql,["lucy",21,"123"])
# 2.3插入多条记录
rows=cursor.executemany(sql,[("ago",26,""),("Lili",23,"")])
conn.commit() # 这一步是提交到数据库的.如果没有这一步,上面的插入不生效
#3.关闭游标
cursor.close()
#4.关闭连接
conn.close()
删:
import pymysql #删
name = input("name:").strip()
# 1.连接拿到游标
conn=pymysql.connect(host="localhost",user="root",password="",
database="db7",charset="utf8"
)
cursor=conn.cursor() # 拿到游标,即mysql> # 2.执行sql
sql='delete from user where name = %s;'
print(sql)
rows = cursor.execute(sql,(name))
print('%s row in set (0.00 sec)'%rows)
#提交到数据库
conn.commit()
#3.关闭游标
cursor.close()
#4.关闭连接
conn.close()
改:
import pymysql #改
id = input("id:").strip()
# 1.连接拿到游标
conn=pymysql.connect(host="localhost",user="root",password="",
database="db7",charset="utf8"
)
cursor=conn.cursor() # 拿到游标,即mysql> # 2.执行sql
sql='update user set password ="999999" WHERE id = %s;'
print(sql)
rows = cursor.execute(sql,(id))
print('%s row in set (0.00 sec)'%rows)
#提交到数据库
conn.commit()
#3.关闭游标
cursor.close()
#4.关闭连接
conn.close()
五、查:fetchone,fetchmany,fetchall
import pymysql #查:fetchone,fetchmany,fetchall # 1.连接拿到游标
conn=pymysql.connect(host="localhost",user="root",password="",
database="db7",charset="utf8"
)
cursor=conn.cursor() # 拿到游标,即mysql>
注:如果当有很多条sql记录的时候,用上面的方式拿到游标,并不能显示字段信息.要使用下面的方式:
cursor=conn.cursor(pymysql.cursor.DictCursor)
# 2.执行sql
sql='select * from user;' rows = cursor.execute(sql) #单条查询
res1 = cursor.fetchone()
res2 = cursor.fetchone()
res3 = cursor.fetchone()
res4 = cursor.fetchone()
res5 = cursor.fetchone()
res6 = cursor.fetchone() #数据库里只有5条记录,没有第六条,输入None print(res1)
print(res2)
print(res3)
print(res4)
print(res5)
print(res6) #输入None #查询多条
res = cursor.fetchmany(4) #一次查询4条
print(res) #查询所有
res = cursor.fetchall()
print(res) #-----------------------光标移动--------------------------
#1,绝对移动:从文件开头位置算起
print(cursor.fetchall())
cursor.scroll(0,mode="absolute") #0是开头的位置,所以下次读取的内容和上次是一样的
print(cursor.fetchall())
cursor.scroll(1,mode="absolute") #1是第一个数据之后的位置(光标移动到第一个数据的尾部),下次读取从第二个开始
print(cursor.fetchall()) #2,相对移动
print(cursor.fetchone())
print(cursor.fetchone())
cursor.scroll(1,mode='relative') #相对于前面2个,把光标移动到下一个数据的尾部.(即前面数据数量+1的数据尾部的位置)
print(cursor.fetchone()) #3.关闭游标
cursor.close()
#4.关闭连接
conn.close()
六、获取插入的最后一条数据的自增ID
import pymysql
conn=pymysql.connect(host='localhost',user='root',password='',
database='db7',charset='utf8')
cursor=conn.cursor() sql='insert into user(name,age,password) values(%s,%s,%s);'
rows=cursor.execute(sql,('alex1',20,''))
# rows=cursor.executemany(sql,[('yuanhao','123'),('laowu','123'),('kgf','12323')])
conn.commit()
print(cursor.lastrowid) #查看表中最后一行的iD cursor.close()
conn.close()
day 7-21 pymysql模块的更多相关文章
- Python中操作mysql的pymysql模块详解
Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...
- PyMySQL模块的使用
PyMySQL介绍 PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,Python2系列中则使用mysqldb.Django中也可以使用PyMySQL连接MySQL数据库. ...
- Python连接MySQL数据库之pymysql模块使用
安装PyMySQL pip install pymysql PyMySQL介绍 PyMySQL是在python3.x版本中用于连接MySQL服务器的一个库,2中则使用mysqldb. Django中也 ...
- (转)Python中操作mysql的pymysql模块详解
原文:https://www.cnblogs.com/wt11/p/6141225.html https://shockerli.net/post/python3-pymysql/----Python ...
- 第八章| 3. MyAQL数据库|Navicat工具与pymysql模块 | 内置功能 | 索引原理
1.Navicat工具与pymysql模块 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数 ...
- python3之pymysql模块
1.python3 MySQL数据库链接模块 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Pyt ...
- Navicat工具、pymysql模块、数据备份
IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navicat工具,这个工具本质上就是一个socket客户端,可视化的连接mys ...
- pymysql 模块
Python3连接MySQL 介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. Django中也可以使用PyMySQL ...
- pymysql模块使用---Python连接MySQL数据库
pymysql模块使用---Python连接MySQL数据库 浏览目录 pymysql介绍 连接数据库 execute( ) 之 sql 注入 增删改查操作 进阶用法 一.pymysql介绍 1.介绍 ...
随机推荐
- (转)Geoserver基础配图研究
https://blog.csdn.net/zbcx_ZGIS/article/details/82216151 1面图层配图 1.1基本框架 这个是geoserver默认的polygon的代码,我们 ...
- SQL TOP 子句
TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的. 注释:并非所有的数据库系统都支持 TOP 子句. SQL Server 的语法: S ...
- redis配置环境变量
直接上图不解释 redis安装路径,我的电脑右击属性 窗口+R键,输入cmd回车,输入redis-server.exe 回车 再开一个命令窗口,窗口+R键,输入cmd回车,输入 redis-cli. ...
- Python:Day18 os模块、logging模块、正则表达式
迭代器 满足迭代器协议: 1.内部有next方法 2.内部有iter()方法 os模块 import os print(os.getcwd()) #C:\Users\Lowry\PycharmProj ...
- day 07 字符编码
一:字符编码 1.字符编码 什么是字符编码:将人能识别的字符转换为计算机能识别的01二进制的过程就是字符编码,转换的规则就是字符编码表 常用的编码表:ASCII.GBK.Unicode.UTF-8 了 ...
- flask-sqlalchemy 一对一,一对多,多对多操作
先进行如下操作: from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app=Flask(__name__) db= ...
- Spring Security(十):3. What’s New in Spring Security 4.2 (新功能)
Among other things, Spring Security 4.2 brings early support for Spring Framework 5. You can find th ...
- Linux中断管理 (2)软中断和tasklet
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
- Java多线程核心技术(五)单例模式与多线程
本文只需要考虑一件事:如何使单例模式遇到多线程是安全的.正确的 1.立即加载 / "饿汉模式" 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接 ...
- 构建前端gulp自动化
看了很多关于Gulp自动化的相关教程,很感谢大神们的教程, 因为担心自己会忘记啥的,所以就把自己搭建gulp自动化的过程记录下来~~~ gulp是依赖于Nodejs的,所以最好是有点nodejs的基础 ...