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连接mysql1.用python连接mysql的基本语法创建连接conn→创建游标对象cursor→执行sql语句execute→获取数据fetchone→释放游标对象cursor→关闭连接conn # (1) 创建连接 host user password database 这四个参数必须写 conn = pymysql.connect(host="127.0.0.1",user=root123456db0826utf8) (2) 创建游标对象(该对象可以操作数据库增删改查) cursor = conn.cursor() (3) 执行sql语句 sql = select * from employee" 返回的是数据的总条数 res = cursor.execute(sql) print(res) (4)获取数据 fetchone 获取一条 res = cursor.fetchone() res = cursor.fetchone() (5) 释放游标对象 cursor.close() (6) 关闭连接 conn.close() 2.用python 创建&删除表1,2,5,6步骤都是不变的,只改变3.4步即可 conn = pymysql.connect(host=") 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= 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) null ) 1.sql注入的现象import pymysql user = input(请输入用户名: >>> ).strip() pwd = input(请输入密码: >>> ).strip() conn = pymysql.connect(host= conn.cursor() sql = select * from usr_pwd where username='%s' and password='%s' " % (user,pwd) (sql) res =print(res) 查询的条数 if res: print(登录成功) else: 登陆失败) 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 .... ) ) ).strip() conn = pymysql.connect(host= conn.cursor() sql = select * from usr_pwd where username=%s and password=%s res = cursor.execute(sql,(user,pwd) ) 登陆成功" if res else 登录失败) cursor.close() conn.close() part3:python操作mysql增删改查1.创建游标时,可以指定返回值类型为其他(默认是元组)创建mysql 链接 conn = pymysql.connect(host= 查询数据,默认是元组,可以设置返回的类型为字典 pymysql.cursors.DictCursor cursor = 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)" 一次插入一条 res = cursor.execute(sql,(宋云杰) ) 1 获取最后插入这条数据的id号(针对单条数据插入) print(cursor.lastrowid) 3 一次插入多条 res = cursor.executemany( sql,[ (高云峰戈隆袁伟倬刘欣慰) ] ) 打印的是插入的条数4 针对于多条数据,搜最后的id 可以通过倒序查询id sql = select id from t1 order by id desc limit 1(res) 获取最后一个id号 res =print(res) 3.python操作mysql删操作sql = delete from t1 where id = %s res = cursor.execute(sql,(3,)) res: 删除成功删除失败") 4.python操作mysql改操作sql = update t1 set first_name = %s where id = %s王)) 修改成功修改失败") 5.python操作mysql查操作要注意:fetchone? fetchmany fetchall 都是基于上一条数据往下查询 1.获取一条数据:fetchone sql = select * from t1 总条数 获取一条 2.获取多条数据:fetchmany sql = data = cursor.fetchmany() 括号里不写参数,默认搜索的的是一条数据 (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 = 女性" : sex = 男性 money = row[money姓:{},名:{},年龄:{},姓名:{},收入:{}".format(first_name,money) ) 3.获取所有数据: fetchall sql = data = cursor.fetchall() print(data) 4.自定义搜索查询的位置 1.相对滚动 (正数相对于当前位置往后滚,负数相对于当前位置往后滚.) 向前滚3个 cursor.scroll(3,mode=relative) res = 往后滚2个 cursor.scroll(-2,1)">print(res) 2.绝对滚动,永远基于第一条数据的位置进行移动 cursor.scroll(0,1)">absolute(cursor.fetchone()) cursor.scroll(1,1)">(cursor.fetchone()) cursor.scroll(3,1)">(cursor.fetchone()) 往前滚没有数据,超出范围 error报错 cursor.scroll(-1,1)"> 在进行增删改查时,必须提交数据,才会产生影响. 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |