一、安装的两种方法

第一种:

#安装
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模块的更多相关文章

  1. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  2. PyMySQL模块的使用

    PyMySQL介绍 PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,Python2系列中则使用mysqldb.Django中也可以使用PyMySQL连接MySQL数据库. ...

  3. Python连接MySQL数据库之pymysql模块使用

    安装PyMySQL pip install pymysql PyMySQL介绍 PyMySQL是在python3.x版本中用于连接MySQL服务器的一个库,2中则使用mysqldb. Django中也 ...

  4. (转)Python中操作mysql的pymysql模块详解

    原文:https://www.cnblogs.com/wt11/p/6141225.html https://shockerli.net/post/python3-pymysql/----Python ...

  5. 第八章| 3. MyAQL数据库|Navicat工具与pymysql模块 | 内置功能 | 索引原理

    1.Navicat工具与pymysql模块 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数 ...

  6. python3之pymysql模块

    1.python3 MySQL数据库链接模块 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Pyt ...

  7. Navicat工具、pymysql模块、数据备份

    IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navicat工具,这个工具本质上就是一个socket客户端,可视化的连接mys ...

  8. pymysql 模块

    Python3连接MySQL 介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. Django中也可以使用PyMySQL ...

  9. pymysql模块使用---Python连接MySQL数据库

    pymysql模块使用---Python连接MySQL数据库 浏览目录 pymysql介绍 连接数据库 execute( ) 之 sql 注入 增删改查操作 进阶用法 一.pymysql介绍 1.介绍 ...

随机推荐

  1. JavaScript 概述

    什么是JavaScriptJavaScript 是一种具有面向对象能力的.解释型的程序设计语言. 它是基于对象和事件驱动并具有相对安全性的客户端脚本语言. 主要目的是,验证发往服务器端的数据.增加 W ...

  2. android与c#之间scoket获取数据进行赋值显示的问题

    Android端发送的信息为:“手机号码,低压,高压,心率”. 需要实时的将接收到的信息显示到“数据栏”中,但是在执行监听任务的时候,启用了一个主线程,在接收数据的时候直接将数值复制给文本框会出现错误 ...

  3. Mysql SQL分组取每组前几条记录

    按name分组取最大的两个val: [比当前记录val大的条数]小于2条:即当前记录为为分组中的前两条 > (select count(*) from tb where name = a.nam ...

  4. 003_生成器(generator)内部解析

    #http://kb.cnblogs.com/page/87128/(未看完)

  5. 吴恩达课后作业学习1-week2-homework-logistic

    参考:https://blog.csdn.net/u013733326/article/details/79639509 希望大家直接到上面的网址去查看代码,下面是本人的笔记 搭建一个能够 “识别猫” ...

  6. 深入源码理解ThreadLocal和ThreadLocalMap

    一.ThreadLoacl的理解: 官方的讲: ThreadLocal是一个本地线程副本变量工具类,主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰 通俗的讲: Thre ...

  7. Cgroups 与 Systemd

    Cgroups 是 linux 内核提供的一种机制,如果你还不了解 cgroups,请参考前文<Linux cgroups 简介>先了解 cgroups.当 Linux 的 init 系统 ...

  8. CountDownLatch和CyclicBarrier模拟同时并发请求

    有时候要测试一下某个功能的并发能力,又不要想借助于其他测试工具,索性就自己写简单的demo模拟一个并发请求就最方便了.如果熟悉jemter的测试某接口的并发能力其实更专业,此处只是自己折腾着玩. Co ...

  9. 关于VS2017 添加 EF的MVC控制器报错的解决方法

    1. 错误描述 :no database provider has been configured fot this DbContext. 此类错误是上下文的注册造成的.解决方式在DBContext中 ...

  10. python四:函数练习--小白博客

    为什么要有函数?函数式编程定义一次,多出调用函数在一定程度上可以理解为变量函数的内存地址加上()就是调用函数本身也可以当做参数去传参 不用函数:组织结构不清晰代码的重复性 def test():#te ...