一、操作数据库模板

pymysql是Python中操作mysql的模块,(使用方法几乎和MySQLdb相同,但是在Python3中,mysqldb这个库已经不能继续使用了)

下载安装方法:

方法一、

在cmd中输入下面的命令即可下载:

pip3 install pymysql

方法二、

在pycharm集成开发环境中进行安装模块:

File-->Settings-->Project:xxx-->Project Interpreter-->右侧有个小 ‘+’ 号,点击--->在输入框里输入要安装的模块(pymysql)-->左下角Install Package

使用步骤:

连接数据库--->创建游标--->执行SQL--->fetch获得数据,进行业务处理--->关闭游标--->commit--->关闭数据库连接

二、基本使用

import pymysql
user=input('用户名: ').strip()
pwd=input('密码: ').strip() #链接
conn=pymysql.connect(host='localhost',user='root',password='',database='db2',charset='utf8') #与数据库的服务端建立连接,databases是我们要查询的表所在的数据库
#游标
cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
#配置结果集为字典形式
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) #执行sql语句
sql='select * from user where username="%s" and password="%s"' %(user,pwd) #注意%s需要加引号,就是一条基本的sql语句,事先要在user表中插入数据,这样查询才会有结果
print(sql)
res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目,我只在表中插入一条记录,查询成功最多所以也就一条记录数
print(res) cursor.close()
conn.close()
if res:
print('登录成功')
else:
print('登录失败')

三、sql注入问题

首先明确一点:--是sql语句的注释,他会注释掉--sql后面的语句,语法为:--sql语句

根本原理:就根据程序的字符串的拼接,user='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'

#1、sql注入之:用户名存在,绕过密码
xingxing' -- 任意字符 #2、sql注入之:用户不存在,绕过用户名与密码
xxx' or 1=1 -- 任意字符

准备条件:

首先自己先创建一个库,在库下面创建一个表,在表中插入一些记录,准备好条件我们就可以来测试一下如何跳过用户名或密码直接登陆吧

import pymysql
user=input('用户名: ').strip()
pwd=input('密码: ').strip() #链接
#localhost也可换成'127.0.0.1',port=3306
conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='',database='db7',charset='utf8')
#游标
cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) #返回的结果是列表内套着一个一个字典的形式 #执行sql语句
sql='select * from user where user="%s" and pwd="%s"' %(user,pwd) #注意%s需要加引号
print(sql)
res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
print(res) cursor.close()
conn.close() if res:
print('登录成功')
else:
print('用户名或密码错误')

sql注入问题

那么我们如何避免用户通过输入特殊字符来跳过用户名或密码直接登陆呢

解决办法:

# 原来是我们对sql进行字符串拼接
# sql="select * from user where user='%s' and pwd='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql) #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from user where user=%s and pwd=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

代码实现:

import pymysql
user=input('用户名: ').strip()
pwd=input('密码: ').strip() #链接
#localhost也可换成'127.0.0.1',port=3306
conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='',database='db7',charset='utf8')
#游标
cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) #返回的结果是列表内套着一个一个字典的形式 #执行sql语句
#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql='select * from user where user=%s and pwd=%s' #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
print(sql)
res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
print(res) cursor.close()
conn.close() if res:
print('登录成功')
else:
print('用户名或密码错误')

sql注入解决办法

四、增、删、改

import pymysql
'''链接(连接数据库并切换到指定的数据库下)'''
conn=pymysql.connect(host='localhost',user='root',password='',database='db2')
'''游标'''
cursor=conn.cursor() '''
执行sql语句
part1
'''
sql='insert into user(username,password) values("liuqingzheng","123456");'
res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
print(res) '''part2'''
# sql='insert into user (username,oassword) values (%s,%s)'
# res=cursor.execute(sql,("xingxing","123")) #执行sql语句,返回sql成功插入的记录数
# print(res) '''part3 插入'''
# sql='insert into user(username,password) values(%s,%s);'
# res=cursor.executemany(sql,[("xingxing","123"),("yueliang","123"),("taiyang","123")]) #可以同时插入多行记录,执行sql语句,返回sql影响成功的行数
# print(res) '''part4 修改'''
# sql='update user set username=%s , password = %s where id=%s'
# res=cursor.execute(sql,['love','1314',5]) #执行sql语句,返回sql影响成功的行数,修改记录中id=5,将用户名该为love,密码改为1314
# print(res) #成功修改一条记录内容 '''part5 删除'''
# sql= 'delete from user where id = %s'
# res=cursor.execute(sql,2) #删除指定的某一条记录,删除第二掉记录
# print(res)
conn.commit() #提交后才发现表中插入记录成功,强调如果没有提交记录是不能插入成功的(增、删、改必须要commit)
cursor.close() #关闭游标
conn.close() #关闭连接(套接字)

五、查询之fetchone、fetchmany、fetchall

import pymysql
#建立与数据库的连接
conn=pymysql.connect(host='localhost',user='root',password='',database='db2') #创建游标
cursor=conn.cursor() #执行sql语句
sql='select * from user;'
rows=cursor.execute(sql) #返回的是表中所有记录的条数
cursor.scroll(3,mode='absolute') # 相对绝对位置移动,第一个参数是相对绝对位置移动的记录条个数
# cursor.scroll(1,mode='relative') # 相对当前位置移动,第一个参数是相对当前位置移动的记录条个数 #通过fetchone、fetchmany、fetchall拿到查询结果
res1=cursor.fetchone() #以元组的形式,返回查询记录的结果,默认是从第一条记录开始查询
# res2=cursor.fetchone() #会接着上一次的查询记录结果继续往下查询
# res3=cursor.fetchone()
# res4=cursor.fetchmany(2) #查询两条记录会以元组套小元组的形式进行展示
# res5=cursor.fetchall() #打印查询的最终结果到终端
print(res1)
# print(res2)
# print(res3)
# print(res4)
# print(res5) #会元组套小元组的形式将表中的左右记录头查询出来展示在终端
print('%s行数据'%rows)

六、获取插入最新自增id

import pymysql
conn=pymysql.connect(host='localhost',user='root',password='',database='db2')
cursor=conn.cursor() sql='insert into user(username,password) values(%s,%s);'
rows=cursor.execute(sql,['hxx','']) #查看的就是当前插入这条记录的id,传入当前查询的sql语句和要插入的记录内容
# rows= cursor.executemany(sql,[('hxx','111'),('hxx1','222')]) #虽然插入2条记录,但是任然会以第一台哦记录的id为准
print(cursor.lastrowid) #在插入语句后查看,查看的id是当前插入的记录的第一条记录的id conn.commit()
cursor.close()
conn.close()
print(cursor.lastrowid) #放在这也可以

七、注意事项

fetch获取的数据默认是元组,如果想要字典类型:

import pymysql
#链接
conn=pymysql.connect(host='localhost',user='root',password='',database='db2')
#游标
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)#在此处设置
#执行sql语句
sql='select * from user;'
rows=cursor.execute(sql)
res1=cursor.fetchone() #查询的结果就是一个字典的形式,字典的key就是对应的字段名,value就是字段名对应的记录内容
# res1=cursor.fetchall() #查询多条或所有结果是一个列表中套着一个一个字典
print(res1)

pymysql模块使用教程的更多相关文章

  1. mysql之Navicat工具、pymysql模块

    1. IDE工具介绍(Navicat) 为了方便测试,使用IDE工具,就是Navicat,这个工具本质上就是一个socket客户端,可视化的连接mysql服务端的一个工具,并且是图形界面版的.它和直接 ...

  2. Navicat工具、pymysql模块 sql注入

    cls超 Navicat工具.pymysql模块 阅读目录 一 IDE工具介绍 二 pymysql模块 一 IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试, ...

  3. Navicat工具、pymysql模块

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

  4. navicat工具 pymysql模块

    目录 一 IDE工具介绍(Navicat) 二 pymysql模块 一 IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navi ...

  5. 百万年薪python之路 -- MySQL数据库之 Navicat工具和pymysql模块

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

  6. pymysql 模块简单使用

    目录 pymysql 模块简单使用 安装 pymysql 模块 使用 pymysql 连接数据库 并插入数据 使用pymysql 插入数据 修改查询显示结果 pymysql 模块简单使用 安装 pym ...

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

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

  8. python实战第一天-pymysql模块并练习

    操作系统 Ubuntu 15.10 IDE & editor JetBrains PyCharm 5.0.2 ipython3 Python版本 python-3.4.3 安装pymysql模 ...

  9. pymysql 模块介绍

    pymysql模块是python与mysql进行交互的一个模块. pymysql模块的安装: pymysql模块的用法: import pymysql user=input('user>> ...

随机推荐

  1. 解决win 和 ubuntu 虚拟机之间 无法 复制粘贴的问题,以及重装vmtool后,还是无法解决的办法

    第一步:重新安装vmware-tool 我这里已经装过了,所以显示这个,不然应该是显示:安装 VMware Tools 它会打开一个文件夹,把压缩包复制到任一个地方解压,执行.pl的那个文件:sudo ...

  2. Linux bzip2命令详解

    Linux bzip/bunzip2命令是.bz2文件的解压缩程序. bunzip2可解压缩.bz2格式的压缩文件.bunzip2实际上是bzip2的符号连接,执行bunzip2与bzip2 -d的效 ...

  3. Linux通过docker安装运行酷Q--用QQ骰子君进行跑团

    Linux通过docker安装运行酷Q 文:铁乐与猫 需求:和小伙伴周末进行愉快的TRPG跑团,需要在QQ讨论组上加了qq小号后,将qq小号用酷Q配合投骰的应用变成骰子君. 限制:我个人的云计算服务器 ...

  4. 【转】爬虫的一般方法、异步、并发与框架scrapy的效率比较

    该文非原创文字,文字转载至  jclian91  链接:https://www.cnblogs.com/jclian91/p/9799697.html Python爬虫的N种姿势   问题的由来    ...

  5. SQL Server与CLR数据类型的对应关系

    数据库 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean char string date System ...

  6. js检测密码强度

    <script> function AuthPasswd(string) {     if(string.length >=6) {         if(/[a-zA-Z]+/.t ...

  7. 将项目发布到Maven中央仓库的不完整纪要

    背景 有几个Utils性质的Jar需要跨项目引用,原本想部署私有Maven仓库,后来感觉太麻烦,索性直接发布到中央库,引用时也方便. 发布成功之后,觉得某些细节还是有必要记录一下. 资源 Sonaty ...

  8. Jsp实现在线作业提交系统

    Jsp实现在线作业提交系统 作为 Computer Science 的学生,凌晨四点之前睡都应该感到羞耻. 项目托管地址:https://github.com/four-in-the-morning/ ...

  9. c++——初始化列表

    多个对象构造和析构 1对象初始化列表 1)对象初始化列表出现原因 1.必须这样做: 如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数.这时要 ...

  10. pom xml testng

    <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId ...