目录
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