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.介绍 ...
随机推荐
- 安利一个_Java学习笔记总结
javaIO 字符编码 多线程 线程池 ArrayList遍历方式 LinkedList遍历方式 Vector遍历方式 Vector, ArrayList, LinkedList 的区别是什么? Ha ...
- android studio 定位具体的错误原因
编译一个数据监测APP的时候出现了报错: Error:Compilation failed; see the compiler error output for details. 在网上查到方法如下: ...
- java 基础响应体定义 - 通用
package com.teewon.viewservice.entitiy.base; import java.io.Serializable; import java.util.List; pub ...
- php实现TXT小说章节解析、小说章节在线阅读
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 要实现TXT文本章节的解析,大概思路是在每个章节加入了特定的字符,然后根据字符的起始位 ...
- 【vue】vue-router的用法
依赖安装:(c)npm install vue-router 过程: import Vue from 'vue'; import Router from 'vue-router'; Vue.use(R ...
- sqlachemy 获取新创建对象的id,flush与commit
for account_info in valid_account_detail: try: account = account_info.get('account') password = acco ...
- java操作Redis缓存设置过期时间
关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间. 在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息 ...
- linux进程管理总结
目录 一.进程相关的概念 二.关闭会话时子进程进程被杀死 三.nohup的原理 四.setsid原理 五.daemon &和守护进程的区别 六.服务进程为什么要fork两次 七.systemd ...
- UVA10256 The Great Divide
怎么又没人写题解,那我来贡献一发好了. 题目意思很简单,平面上有两种颜色的点,问你能否求出一条直线使两种颜色的点完全分开. 首先我们考虑两个点集相离的充要条件,这两个点集的凸包必须相离.(很好证明或者 ...
- Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务
首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...