python学习第38天
Posted 打酱油的阿超
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习第38天相关的知识,希望对你有一定的参考价值。
一.python操作mysql
1.1 基本语法
创建连接 host user passwor database 这四个参数必须写
import pymysql
conn=pymysql.connect(host="127.0.0.1",user="root",password="",database="db0618",port=3306)
创建游标对象,该对象可以进行增删改查操作
cursor = conn.cursor()
执行sql语句
sql = "select * from employee"
res = cursor.execute(sql) # 返回的是数据的总条数
print(res)
获取数据
res = cursor.fetchone()
print(res)
释放游标对象.关闭连接
cursor.close()
conn.close()
1.2 创建/删除 表
conn = pymysql.connect(host="127.0.0.1",user="root",password="",database="db0619")
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) # 返回字段的个数
print(cursor.fetchone())
"""
# 3.删除表
"""
try :
sql = "drop table t1"
res = cursor.execute(sql)
print(res)
except:
pass
cursor.close()
conn.close()
"""
1.3 事务处理
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 = ‘111egon‘ where id = 1 "
sql4 = "commit"
res1 = cursor.execute(sql1)
res2 = cursor.execute(sql2)
res3 = cursor.execute(sql3)
# res4 = cursor.execute(sql4)
# print(res1,res2,res3,res4)
# print(cursor.fetchone())
cursor.close()
conn.close()
1.4 sql 注入攻击
利用mysql语法的漏洞 来绕开检测密码和账户名的步骤,已达到登录别人账号的操作
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()
当输入: 随便啥字符‘ or 1 =1 -- 随便啥字符时 即可绕过账号名和密码检测环节
-- 代表后面的密码都是注释
解决办法就是使用预处理机制,可以避免绝大多数的sql注入问题
execute 参数1 是一个sql 语句 ,如果sql语句和里面的参数值分开执行,默认开启预处理
execute(sql.(参数2,参数3...))
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"
res = cursor.execute(sql, (user,pwd))
print("登录成功" if res else "登录失败")
cursor.close()
conn.close()
1.5 python 操作mysql 增
python 操作mysql时候,默认开启事务,必须在增删改之后
提交数据,才会对数据库产生影响,否则默认回滚
提交数据: conn.commit()
回滚数据: conn.rollback()
execute 指定单条
executemany 执行多条
# 1.创建mysql连接
conn = pymysql.connect(host="127.0.0.1",user="root",password="",database="db0619")
# 查询数据,默认是元组,可以设置返回字典类型, pymysql.cursors.DictCursor
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
# 增
"""
sql = "insert into t1(first_name , last_name ,age ,sex,money) values(%s,%s,%s,%s,%s)"
# 一次插入一条数据
# res = cursor.execute(sql,("王","振",80,0,12000))
# print(res)
# 一次插入多条数据
res = cursor.executemany(sql,[("尉","翼麟",18,1,12000),("谢","晨",80,0,200),("主","胜",3,0,9.9)])
print(res)
# 获取最后插入这条数据的id号(针对于单条数据执行,获取最后的id,如果多条数据的执行,以第一条数据的id为主)
print(cursor.lastrowid)
# 针对于多条数据最后的id,可以通过倒序查询,找到id号
# select id from t1 order by id desc limit 1
1.6 删
sql = "delete from t1 where id = %s"
res = cursor.execute(sql,(8,))
print(res)
if res:
print("删除成功")
else:
print("删除失败")
executemany可以删除多条数据
1.7 改
sql = "update t1 set first_name = %s where id = %s"
res = cursor.execute(sql,(‘王‘,10))
print(res)
if res:
print("更新成功")
else:
print("更新失败")
executemany 可以更改多条数据
1.8 查
fetchone 获取一条数据
fetchmany 获取多条数据,默认从上一条数据继续向下搜索(性质类似于迭代器)
fetchall获取所有数据基于上一条数据往下搜索(性质类似于迭代器)
sql = "select * from t1"
res = cursor.execute(sql)
# print(res) # 总条数
# (1) 获取一条数据 fetchone
# res = cursor.fetchone()
# print(res) # {‘id‘: 9, ‘first_name‘: ‘王‘, ‘last_name‘: ‘翼麟‘, ‘age‘: 18, ‘sex‘: 1, ‘money‘: 12000.0}
# (2) 获取多条数据 fetchmany 默认从上一条数据继续向下搜索(性质类似于迭代器)
# data = cursor.fetchmany() # 没有参数,默认只获取一条
# data = cursor.fetchmany(3)
# print(data)
自定义搜索查询的位置
sql = "select * from t1 where id >=10"
res = cursor.execute(sql)
res = cursor.fetchone()
print(res)
相对滚动
#向后
cursor.scroll(3,mode="relative")
res = cursor.fetchone()
print(res)
# 方向向前 (无论前后,不能超出范围)
cursor.scroll(-3,mode="relative")
res = cursor.fetchone()
print(res)
绝对滚动,永远基于第一条数据的位置滚动
cursor.scroll(0,mode="absolute")
print(cursor.fetchone())
cursor.scroll(1,mode="absolute")
print(cursor.fetchone())
cursor.scroll(2,mode="absolute")
print(cursor.fetchone())
# 往前滚没数据,超出范围error
cursor.scroll(-1,mode="absolute")
print(cursor.fetchone())
在进行增删改的时候,必须通过commit提交数据,才会对数据库进行更新,否则默认回滚
1.9导出数据库
第一步 : 先退出数据库
第二部 : 切换到对应的导出路径
第三步 :
# 导出所有
mysqldump -uroot -p 数据库名 > 数据库名.sql
# 导出单个
mysqldump -uroot -p db0619 t1 > t1.sql
2.0导入数据库
第一步 : 县创建一个空的数据库
第二部 : 找到对应的sql文件的路径
第三步 : source 路径/sql文件
以上是关于python学习第38天的主要内容,如果未能解决你的问题,请参考以下文章