AI智能
改变未来

day40:MySQL:python操作mysql:pymysql模块&SQL注入攻击


目录

part1:用python连接mysql

  1.用python连接mysql的基本语法

  2.用python 创建&删除表

  3.用python操作事务处理

part2:sql注入攻击

  1.sql注入的现象

  2.预处理机制:防止sql注入现象

part3:python操作mysql增删改查

part4:导出导入数据库

part1:用python连接mysql

1.用python连接mysql的基本语法

创建连接conn→创建游标对象cursor→执行sql语句execute→获取数据fetchone→释放游标对象cursor→关闭连接conn

# (1) 创建连接  host  user  password  database 这四个参数必须写conn = pymysql.connect(host=\"127.0.0.1\",user=\"root\",password=\"123456\",database=\"db0826\",charset=\"utf8\",port=3306)# (2) 创建游标对象(该对象可以操作数据库增删改查)cursor = conn.cursor()# (3) 执行sql语句sql = \"select * from employee\"# 返回的是数据的总条数res = cursor.execute(sql)print(res)# (4)获取数据 fetchone 获取一条res = cursor.fetchone()res = cursor.fetchone()print(res)# (5) 释放游标对象cursor.close()# (6) 关闭连接conn.close()

2.用python 创建&删除表

1,2,5,6步骤都是不变的,只改变3.4步即可

conn = pymysql.connect(host=\"127.0.0.1\",user=\"root\",password=\"123456\",database=\"db0826\")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())print(cursor.fetchone())print(cursor.fetchone())print(cursor.fetchone())print(cursor.fetchone())print(cursor.fetchone())\"\"\"# 3.删除表\"\"\"try:sql = \"drop table t1\"res = cursor.execute(sql)print(res)except:pass\"\"\"cursor.close()conn.close()

3.用python操作事务处理

pymysql 操作事务处理时,需要commit提交数据,才会变化,否则rollback回滚.恢复到最初状态

请注意:你sql语句里写的是增删改,你得到的execute的返回值没有任何意义,所以你fetchone是无效的,只有你sql语句写的是查询的操作,fetchone才能获取到数据  

conn = pymysql.connect(host=\"127.0.0.1\",user=\"root\",password=\"123456\",database=\"db0826\")cursor = conn.cursor()sql1 = \"begin\"sql2 = \"update employee set emp_name = \'123egon\' where id = 1\"sql3 = \"commit\"res1 = cursor.execute(sql1)res2 = cursor.execute(sql2)res3 = cursor.execute(sql3)# print(res1,res2,res3) # 返回值没有意义# fetchone 与查询sql有关 , 增删改无效;# tup = cursor.fetchone()# print(tup)cursor.close()conn.close()

part2: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 pymysqluser = input(\"请输入用户名: >>> \").strip()pwd = input(\"请输入密码: >>> \").strip()conn = pymysql.connect(host=\"127.0.0.1\",user=\"root\",password=\"123456\",database=\"db0826\")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()

输入时账号输入:sfsdf\’ or 3=3 — sdfsd 密码随意输入都可以登录成功

原因:– 后面的字符串都会被注释掉, 前面账号虽然是错的 但是 2=2是真的 绕开了账号和密码的判断;

select * from usr_pwd where username=\’afasdfasdfasdf\’ or 2=2 — sfasdf\’ and password=\’3434

2.预处理机制:防止sql注入现象

使用预处理机制,可以避免绝大多数sql注入的问题

execute 如果参数为2个,将默认开启预处理

execute(sql , (参数1,参数2,参数3 …. ) )

import pymysqluser = input(\"请输入用户名: >>> \").strip()pwd = input(\"请输入密码: >>> \").strip()conn = pymysql.connect(host=\"127.0.0.1\",user=\"root\",password=\"123456\",database=\"db0826\")cursor = conn.cursor()sql = \"select * from usr_pwd where username=%s and password=%s\"res = cursor.execute(sql, (user,pwd) )print(\"登陆成功\" if res  else \"登录失败\")cursor.close()conn.close()

part3:python操作mysql增删改查

1.创建游标时,可以指定返回值类型为其他(默认是元组)

# 创建mysql 链接conn = pymysql.connect(host=\"127.0.0.1\",user=\"root\",password=\"123456\",database=\"db0826\")# 查询数据,默认是元组,可以设置返回的类型为字典 pymysql.cursors.DictCursorcursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

2.python操作mysql增操作

cursor.executemany:可以一次插入多条数据

cursor.lastrowid:获取最后插入这条数据的id号(仅针对单条数据插入)

# sql增语句sql = \"insert into t1(first_name,last_name,age,sex,money) values(%s,%s,%s,%s,%s)\"# 一次插入一条res = cursor.execute(sql, (\"宋\",\"云杰\",30,0,15000) )print(res) # 1# 获取最后插入这条数据的id号(针对单条数据插入)print(cursor.lastrowid) # 3# 一次插入多条res = cursor.executemany(  sql,  [  (\"高\",\"云峰\",50,1,16000) , (\"戈\",\"隆\",80,1,17000) , (\"袁\",\"伟倬\",120,0,130000) , (\"刘\",\"欣慰\",150,0,18000)   ]   )print(res) # 打印的是插入的条数4# 针对于多条数据,搜最后的id 可以通过倒序查询idsql = \"select id from t1 order by id desc limit 1\"res = cursor.execute(sql)print(res)# 获取最后一个id号res = cursor.fetchone()print(res)

3.python操作mysql删操作

sql = \"delete from t1 where id = %s\"res = cursor.execute(sql , (3,))print(res)if res:print(\"删除成功\")else:print(\"删除失败\")

4.python操作mysql改操作

sql = \"update t1 set first_name = %s where id = %s\"res = cursor.execute(sql,(\"王\",4))print(res)if res:print(\"修改成功\")else:print(\"修改失败\")

5.python操作mysql查操作

要注意:fetchone fetchmany fetchall 都是基于上一条数据往下查询

1.获取一条数据:fetchone

sql = \"select * from t1\"res = cursor.execute(sql)print(res) # 总条数res = cursor.fetchone()print(res) # 获取一条

2.获取多条数据:fetchmany

sql = \"select * from t1\"res = cursor.execute(sql)print(res) # 总条数data = cursor.fetchmany() # 括号里不写参数,默认搜索的的是一条数据print(data)data = cursor.fetchmany(3) # 基于上一次获取完的位置再获取三条print(data)

data一共是三条数据,我们可以通过for循环取出每一条数据,并且按照自己的格式进行拼接

for row in data :# print(row)first_name = row[\"first_name\"]last_name = row[\"last_name\"]age = row[\"age\"]if row[\"sex\"] == 0:sex = \"女性\"else:sex = \"男性\"money = row[\"money\"]print(\"姓:{},名:{},年龄:{},姓名:{},收入:{}\".format(first_name,last_name,age,sex,money)  )

3.获取所有数据: fetchall

sql = \"select * from t1\"res = cursor.execute(sql)print(res) # 总条数data = cursor.fetchall()print(data)

4.自定义搜索查询的位置

1.相对滚动 (正数相对于当前位置往后滚,负数相对于当前位置往后滚.)

# 向前滚3个cursor.scroll(3,mode=\"relative\")res = cursor.fetchone()print(res)# 往后滚2个cursor.scroll(-2,mode=\"relative\")res = cursor.fetchone()print(res)

2.绝对滚动 , 永远基于第一条数据的位置进行移动

cursor.scroll(0,mode=\"absolute\")print(cursor.fetchone())cursor.scroll(1,mode=\"absolute\")print(cursor.fetchone())cursor.scroll(3,mode=\"absolute\")print(cursor.fetchone())# 往前滚没有数据,超出范围 error报错cursor.scroll(-1,mode=\"absolute\")print(cursor.fetchone())# 在进行增删改查时,必须提交数据,才会产生影响.conn.commit()cursor.close()conn.close()

part4:导出导入数据库

1.导出数据库

第一步: 先退出数据库

第二步: 切换到对应的路径(你想将导出的数据库文件放到哪个目录)

  mysqldump -uroot -p db0824 > db0824.sql

第三步:导出所有内容(整个数据库)

  mysqldump -uroot -p db0824 > db0824.sql

导出数据库中的单个表

  mysqldump -uroot -p db0824 t1 > t1.sql

2.导入数据库

第一步 : 先创建一个空的数据库

第二步 : 找到sql对应文件目录

第三步 : source 路径/文件

   use 数据库

   source D:\\db0824.sql

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » day40:MySQL:python操作mysql:pymysql模块&SQL注入攻击