pymysql基本语法,sql注入攻击,python操作pymysql,数据库导入导出及恢复数据---day38
1.pymysql基本语法
# ### python操作mysql
import pymysql
'''
# ### 1.基本语法
#(1) 创建连接 host user password database 四个参数必写
conn = pymysql.connect(host='127.0.0.1',user='root',password='',database='zuoye',charset='utf8',port=3306)
#(2)创建游标对象,该对象可以进行增删改查操作
cursor = conn.cursor()
#(3)执行一个sql语句
sql = 'select * from student'
#返回的是数据的总条数
res = cursor.execute(sql)
print(res)
#(4)获取数据
res = cursor.fetchone() #一条
print(res)
#(5)释放游标对象
cursor.close()
#(6)关闭连接
conn.close()
''' # ### 创建/删除 表
'''
conn = pymysql.connect(host='127.0.0.1',user='root',password='',database='db0620')
cursor = conn.cursor()
#1.创建一张表
sql = """
create table t1(
id int unsigned primary key auto_increment,
first_name char(10) not null,
last_name char(10) not null,
age int unsigned,
sex tinyint,
money float
)
"""
res = cursor.execute(sql)
print(res)
''' #2.查看表结构
'''
sql = "desc t1"
res = cursor.execute(sql)
print(res) #6 返回字段个数
print(cursor.fetchone())
''' #3.删除表
'''
try:
sql = "drop table t1"
res = cursor.execute(sql)
print(res)
except:
pass
cursor.close()
conn.close()
''' # ### 3.事务处理
'''
begin;
commit;
rollback;
python 操作事务处理 必须通过commit提交数据,才会真正的改变数据,否则进行rollback回滚恢复以前状态
'''
conn = pymysql.connect(host='127.0.0.1',user='root',password='',database='db0618')
cursor = conn.cursor()
sql1 = 'begin'
# sql2 = 'select * from employee'
sql3 = 'update employee set emp_name = "liuwei" where id = 1'
sql4 = 'commit' #必须要提交commit 不然数据不会改变
sql5 = 'select * from employee' res1 = cursor.execute(sql1)
# res2 = cursor.execute(sql2)
res3 = cursor.execute(sql3)
res4 = cursor.execute(sql4)
res5 = cursor.execute(sql5) print(cursor.fetchone()) #获取下一行一条数据
print(cursor.fetchone()) #会跟着上一条往下查询一条数据
# print(res1,res2,res3,res4,res5) cursor.close()
conn.close()
2.sql注入攻击
# ### sql注入攻击
#创建一张表
'''
create table usr_pwd(
id int unsigned primary key auto_increment,
username varchar(255) not null,
password varchar(255) not null
)
'''
#(1) sql 注入问题
import pymysql
user = input("user:").strip()
pwd = input("password:").strip() #创建连接对象
conn = pymysql.connect(host='127.0.0.1',user='root',password='',database='db0619')
#创建游标
cursor = conn.cursor() sql = "select * from usr_pwd where username = '%s' and password = '%s'" % (user,pwd) #注意引号问题
print(sql) res = cursor.execute(sql)
print(res) #查询数据个数 if res:
print("登录成功")
else:
print("登录失败")
cursor.close()
conn.close()
'''
select * from usr_pwd where username = 'wdas3544' or 10 = 10 --324sdadf ' and password ='asdasd'
where username = 'wdas3544' or 10=10 username的判断是假的,但是后面or拼接的条件是真的,所以可以查询成功
--代表后面的代码是注释
把用户名和密码都绕开了,进行sql注入攻击
''' #(2) 解决办法
'''
使用预处理机制,可以避免绝大多数的sql注入问题
execute(sql,(参数1,参数2,参数3...))
execute 第一个参数是一个sql语句,如果sql语句和里面的参数值分开执行,默认开启预处理
'''
import pymysql
user = input("user:").strip()
pwd = input("password:").strip() conn = pymysql.conncet(host='127.0.0.1',user='root',password='',database='db0619')
cursor = conn.cursor()
sql = 'select * from usr_pwd where username = %s and password = %s'
res = cursor.execute(sql,(user,pwd)) if res:
print("登录成功")
else:
print("登录失败")
cursor.close()
conn.close()
3.python操作pymysql
# ### python 操作mysql 增删改查
import pymysql
'''
python操作mysql的时候默认开启事务,必须在增删改之后
提交数据,才会对数据库产生影响,否则默认回滚
提交数据:conn.commit()
回滚数据:conn.rollback() execute 执行单条语句
executemany 执行多条可加参数
'''
#1.创建mysql连接
conn = pymysql.connect(host='127.0.0.1',user='root',password='',database='db0619')
#创建游标 #默认返回元组
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #设置返回字典
sql = "select * from usr_pwd where username = 'liuwei' and password = '111'"
res = cursor.execute(sql)
print(res)
print(cursor.fetchone()) #{'id': 1, 'username': 'liuwei', 'password': '111'} #增
"""
sql = "insert into t1(first_name,last_name,age,sex,money) values(%s,%s,%s,%s,%s)"
#一次插入一条数据
# res = cursor.execute(sql,("吴","号",23,1,12000))
# print(res) #返回1,但是数据库没有数据,必须要手动commit提交 #一次插入多条数据 列表嵌套元组的形式
res = cursor.executemany(sql,[('jack','li',36,1,5000),('如','兰',25,0,6400),('天','天',26,1,9000)])
print(res) #3 返回的是插入的条数 #获取最后插入这条数据的id号
'''
插入单条,获取是最后的id号
插入多条,获取的是以第一条为主的id,把多条当做一个整体
'''
print(cursor.lastrowid) #16 插入了三条 获取的是三条里面第一条的id号 #针对多条数据最后的id,可以通过倒序查询,找到id号
# select id from t1 order by id desc limit 1;
""" #删
"""
sql = 'delete from t1 where id =%s'
res = cursor.execute(sql,(18))
print(res) #成功就是1,失败就是0
if res:
print("删除成功")
else:
print("删除失败")
""" #改
"""
sql = 'update t1 set first_name = %s where id = %s'
res = cursor.execute(sql,('小',11))
print(res) #成功返回1,失败返回0
if res:
print("更新成功")
else:
print("更新失败")
""" #查
sql = 'select * from t1'
res = cursor.execute(sql)
print(res) #总条数
#(1)获取一条数据 fetchone
res = cursor.fetchone()
print(res) #(2)获取多条数据 fetchmany 返回列表嵌套字典,不写参数默认获取一条,并从之前获取的那一条往下获取
data = cursor.fetchmany()
data = cursor.fetchmany(3) #获取3条数据从上一条数据往下获取
print(data)
'''
[{'id': 4, 'first_name': '王', 'last_name': '八', 'age': 45, 'sex': 0, 'money': 3400.0},
{'id': 5, 'first_name': '七', 'last_name': '七', 'age': 23, 'sex': 1, 'money': 4550.0},
{'id': 6, 'first_name': '小', 'last_name': '白', 'age': 54, 'sex': 1, 'money': 12000.0}]
'''
for row in data:
first_name = row["first_name"]
last_name = row["last_name"]
age = row["age"]
if row["sex"] == 0:
sex = "女性"
else:
sex = "男性"
money = row["money"]
print(f"姓:{first_name},名:{last_name},年龄:{age},性别:{sex},收入:{money}") #(3)获取所有数据 fetchall 返回列表嵌套字典,基于上一条数据往下搜索
# data = cursor.fetchall()
# print(data) #(4)自定义搜索查询的位置
sql = 'select * from t1 where id>=3'
res = cursor.execute(sql)
print(res) #返回满足查询的所有条数
res = cursor.fetchone()
print(res) #1.相对滚动 向后滚 不能超过数据范围
cursor.scroll(3,mode='relative')#滚动3条数据
res = cursor.fetchone() #查的话是查滚动3条数据后所在位置的下一条数据
print(res)
#向前滚 不能超过数据范围
cursor.scroll(-2,mode='relative') #向前滚动2条数据
res = cursor.fetchone()#查的话是查向前滚动2条数据后所在位置的下一条数据
print(res) #2.绝对滚动,永远基于第一条数据的位置进行滚动
cursor.scroll(0,mode='absolute') #0就是第一个位置
print(cursor.fetchone())
cursor.scroll(3,mode='absolute') #基于第一条数据的位置滚动3条
print(cursor.fetchone())#查的话是查滚动3条数据后所在位置的下一条数据
#往前滚没数据,因为是永远基于第一条数据的位置进行滚动 error 超出范围
cursor.scroll(-1,mode='absolute')
print(cursor.fetchone()) #在进行增删改的时候,必须通过commit提交数据,才会对数据库进行更新,否则默认回滚
conn.commit() #提交数据
cursor.close()
conn.close()
4.数据库导入导出及恢复数据
# 导出数据库 -d是表结构 不加-d 是表结构和表数据
#第一步:先退出数据库 \q退出数据库
#第二步:切换到对应的导出路径 如d盘 d:
#第三步:执行命令
#导出整个数据库:
mysqldump -uroot -p密码 数据库名 > 数据库名.sql
#导出某个数据库下的一个表
mysqldump -uroot -p密码 数据库名 表名 > 表名.sql
#导出某个数据库下多个表
mysqldump -uroot -p密码 数据库名 表名 表名 表名 > 表名.sql #导入数据库
#第一步:先创建一个空的数据库
#第二步:找到对应的sql文件的路径
#第三步:source 路径/sql文件 #只有frm和ibd如何恢复数据库
#innodb 在只有frm和ibd文件的情况下,如何恢复数据
#安装MySQL Utilities
'''
cmd中找到frm那个文件,执行如下命令:
切换到对应目录,执行下面语句,不要加分号
mysqlfrm --diagnostic ./文件目录/t1.frm
查出建表语句,赋值查询出来的建表语句在mysql中创建的新数据中使用 对已创建的表进行表空间卸载,删除ibd文件
mysql> alter table t1 discard tablespace; 把要恢复的ibd文件替换进去 对已创建的表进行空间装载
mysql> alter table employee import tablespace;
''' '''
当数据库爆炸了和不能启动了可以这样操作
myisam存储的数据:
先在mysql数据库的安装位置data目录下新建一个数据库文件夹,然后把之前数据库中的
三个文件(myisam2.frm,myisam2.MYD,myisam2.MYI)塞到这个新建的数据库文件夹中,就可以恢复数据了
''' '''
innodb存档的数据:
安装MySQL Utilities,
然后在mysql数据库安装位置下的data下新建一个数据库文件夹,然后把之前你要恢复的数据库中的frm文件扔到
这个新建的文件夹中,然后打开cmd,找到现在这个存放frm文件的新的数据库文件夹路径,
然后执行命令mysqlfrm --diagnostic ./frm文件,(执行命令会解析建表语句),然后复制建表语句,然后把现在新的数据库文件夹
下的frm文件删除掉,然后在cmd中登录mysql,去用复制的建表语句去创建表,
执行完建表语句后,需要先卸载空间,执行alter table 表名 discard tablespace;
然后再把之前表里面的ibd文件扔到新的数据库文件夹下,然后在cmd中执行命令装载alter table 表名 import tablespace; '''
pymysql基本语法,sql注入攻击,python操作pymysql,数据库导入导出及恢复数据---day38的更多相关文章
- python-pymysql防止sql注入攻击介绍
目录 pymysql sql 注入攻击 调用存储过程 pymysql pymysql 是一个第三方模块,帮我们封装了 建立表/用户认证/sql的执行/结果的获取 import pymysql # 步骤 ...
- XSS攻击&SQL注入攻击&CSRF攻击?
- XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意 ...
- SQL注入攻击
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...
- SQL注入攻击[详解]
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...
- Java应用开发中的SQL注入攻击
1. 什么是SQL注入攻击? SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员越来越多.但是由于程序员的水平及经验参差不齐,相当一部分 ...
- 什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?
1. XSS(Cross Site Script,跨站脚本攻击) 是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式. 1.1跨站脚本攻击分有两种形式: 反射型攻击(诱使用户点 ...
- python接口自动化(三十八)-python操作mysql数据库(详解)
简介 现在的招聘要求对QA人员的要求越来越高,测试的一些基础知识就不必说了,来说测试知识以外的,会不会一门或者多门开发与语言,能不能读懂代码,会不会Linux,会不会搭建测试系统,会不会常用的数据库, ...
- day40:python操作mysql:pymysql模块&SQL注入攻击
目录 part1:用python连接mysql 1.用python连接mysql的基本语法 2.用python 创建&删除表 3.用python操作事务处理 part2:sql注入攻击 1.s ...
- day40:MySQL:python操作mysql:pymysql模块&SQL注入攻击
目录 part1:用python连接mysql 1.用python连接mysql的基本语法 2.用python 创建&删除表 3.用python操作事务处理 part2:sql注入攻击 1.s ...
- MySQL数据库(六)-- SQL注入攻击、视图、事物、存储过程、流程控制
一.SQL注入攻击 1.什么是SQL注入攻击 一些了解sql语法的用户,可以输入一些关键字 或合法sql,来导致原始的sql逻辑发生变化,从而跳过登录验证 或者 删除数据库 import pymysq ...
随机推荐
- 【转帖】ChatGPT的前身:InstructGPT
https://www.jianshu.com/p/6daf35cbc46a ChatGPT的论文目前还没有发布,在其官方博客(https://openai.com/blog/chatgpt/)中对方 ...
- overcommit_memory的简单学习
overcommit_memory的简单学习 背景 前几天一个测试环境启动失败. 总是有如下的提示: Native memory allocation (mmap) failed to map 122 ...
- 【发现一个问题】VictoriaMetrics中,所有vmstorage在中午12:00切换索引,导致所有vm-insert发生oom
请看我提的issue: https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2464 bug: vm v1.70.0, all vmst ...
- 【K哥爬虫普法】12亿公民信息泄露,仅判3年,个人信息是否为爬虫“禁区”?
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- 『Echarts』简介
目录 一.前言 二.『Echarts』简介 1. 什么是『Echarts』 三.数据可视化 四.『Echarts』 1.『Echarts』的作用 2.『Echarts』能绘制哪些图表 3.『Echar ...
- 【5】数据可视化pygal,画出美观的图表
相关文章: 全网最详细超长python学习笔记.14章节知识点很全面十分详细,快速入门,只用看这一篇你就学会了! [1]windows系统如何安装后缀是whl的python库 [2]超级详细Pytho ...
- HTTP请求头引发的注入问题 (SQL注入)
关于请求头中注入问题的演示,这里我写了一些测试案例,用来测试请求头中存在的问题.我们常见的会发生注入的点有 Referer.X-Forwarded-For.Cookie.X-Real-IP.Accep ...
- 基于AvaloniaUI开发跨平台.NET三维应用:环境搭建
本文介绍在Vistual Studio 2022中使用Avalonia和集成AnyCAD AvaloniaUI三维控件的的过程. 目录 0 初始化环境 1 创建项目 2 集成AnyCAD Avalon ...
- 小知识:如何判定crontab任务的执行频度
所有运维人员都知道crontab定时任务的基本格式如下: * * * * * command 分 时 日 月 周 命令或脚本 如果是写了具体的时间,基本大家都可以清楚的根据这样的规则去匹配对应: 第1 ...
- Windows上同时使用有线网络及无线网络连接配置
由于公司搬到了新的办公地点,公司内部只有内网,当需要连接互联网查询资料时只能切换网络,非常麻烦.所以为了能够同时连接连接公司内网,又能够访问互联网,这里介绍如何同时连接无线和有线. 有线网络:10.3 ...