MySQL知识点补充
1、去重 distinct
select distinct name,age from t1;
# 针对查找出来的结果整行(记录)进行去重,也就是相同行只保存一个
注意点:distinct 必须放在查询列的第一个(放后面就会报错)
2、保存操作记录 tee
tee D:a.txt;
可以把你对于MySQL的所有操作都记录到D盘下的a.txt中(包括一些报错信息)
pymysql包的基本用法
基本的查看
import pymysql
# 导入pymysql包
conn = pymysql.connect(host='localhost',user='root',password='',database='db1',charset='utf8')
# 连接mysql服务器,必须指定主机、用户、密码和你要使用的数据库
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 实例化拿到光标对象,可以对服务器发送sql语句
# cursor=pymysql.cursors.DictCursor是为了让输出变成字典(列名与值对应),不设置的话就是元组
sql = 'select * from t1 where id > %s'% 1
# 写的sql语句不需要封号结尾,如果需要给sql语句传参,需要通过%s传值
cursor.execute(sql)
# 发送sql语句 cursor.fetchall()
cursor.fetchone()
cursor.fetchmany(2)
# 都是拿数据 fetchall拿全部,fetchone拿一个,fetchmany拿多个自己指定
cursor.close()
conn.close()
# 使用完关闭资源
sql注入
含义:
sql指的就是太相信用户的输入,没有对用户输入的参数进行转义,导致用户根据sql语法的特点完成对账号的破解
案例
sql = "select * from t1 where name = '%s' and pwd = '%s'"%(name,pwd) # 例一:用户输入用户名时,输入heheh'#
# 这时得到的sql语句是
"select * from t1 where name = 'heheh'#' and pwd = '%s'"
# 在sql语句中 # 后面的语句是不执行的,所以就可以不输入密码轻松登录
# 例二:用户输入时输入 'asdsfa' or 1 = 1 #
# 这时得到的sql语句是
"select * from t1 where name = 'asdsfa' or 1 = 1 #' and pwd = '%s'"
# or在sql语句中是两边有一个正确就正确,也可以不输入密码登录成功
解决办法
1、自己手工对用户输入的值进行转义
2、使用execute() 自动进行过滤
# 插入一条数据
cursor.execute(sql,('hehhe',''))
# 插入多条可以通过一个列表装起来
data = [('head',''),
('name','pwd')]
cursor.executemany(sql,data)
事务*****
含义:
事务指的是一组操作,要么都成功,要么都失败
特性
1、原子性
一组操作,要么都成功,要么都失败
2、一致性
指事务发生前后的数据总额不变
3、隔离性
简单来说,指某个事物的操作对其他事物不可见
4、持久性
当事务完成后,其影响是保存下来,不能撤销,只能通过开启另一个事务来抵消之前的错误
使用场景
当银行转账时,就需要用来事务,不然会发生一端钱刚扣,另一端还没增加就断电了,不加事务这钱就没了
加了事务,当这两个操作有一个没完成,那这两个都没完成。
代码
在mysql中创建事务方式
start transaction #开启事务
(中间执行sql操作...)
commit # 提交上面的sql,让其生效 rollback # 回滚,撤回操作
ps:如果中间的sql语句中有drop表的操作,rollback就回不来了
在pymsql中
在pymsql中本身就包含了事务的处理,不过需要我们手动提交commit 或者rollback才行
连接mysql服务器的时候会有一个连接的返回值(连接对象)
当我们要执行一些增加、修改、删除操作时,需要通过连接对象提交commit或者rollback才行
当然,rollback时回滚,一般写在抓取到sql语句异常之后