pymysql模块

  1. #安装
  2. pip3 install pymysql
  3. #引包
  4. import pymysql
  5. #连接数据库
  6. conn = pymysql.connect(
  7. host = '127.0.0.1'
  8. port = 3306
  9. user = 'root'
  10. password = 'root' #可简写 passwd = 'root'
  11. database = 'db666' #一定要指定库,可以简写 db='db666'
  12. charset = 'utf8' #不要加横杠‘-’
  13. )
  14. cursor = conn.cursor() #生成游标对象,括号内不加参数的话,查询出来的数据时元组的形式,数据不够明确,容易混乱
  15. cursor = conn.cursor(cursor=pymysql.cursor.DictCursor) #字典形式返回数据,数据有具体的描述信息,更加合理方便
  16. sql = 'select * from user'
  17. affect_row = sursor.execute(sql) #执行sql语句,返回值是当前sql语句执行的受影响的行数
  18. #方法:
  19. cursor.fetchone() #只拿结果的一条
  20. cursor.fetchall() #拿所有
  21. cursor.fetchmany(n) #指定获取几条
  22. """
  23. 上述三个方法在读取数据的时候有一个类似于文件指针的特点
  24. """
  25. cursor.scroll(1,'relative') #相对于光标当前所在的位置往后移动1位
  26. cursor.scroll(1,'absolute') #相对于数据开头往后移动1位

sql注入

  1. 就是利用一些特殊字符,结合软件固定的一些语法句式,非法侵入并违规操作。
  2. MySQL中利用注释的语法,造成了sql注入的问题,用户不需要属于用户名和密码也能够登录并且获取到整个用户表的数据
  3. 日常应用软件在获取用户输入的内容时,都会限制一些特殊符号的输入
  4. **解决方式:**
  5. 所有敏感的信息,不要自己去做拼接操作,交由固定的模块去过滤数据,防止sql注入;
  6. pymsql中,execute就能够过滤;
  1. #sql注入
  2. sql="select * from user where username='%s' and password='%s'"%(username,password)
  3. #使用execute模块
  4. sql="select from user where username=%s and password=%s"
  5. cursor.execute(sql,(username,password)) #只能识别'%'s占位符

pymysql补充

  1. #针对增删改 pymysql需要二次确认commit才能真正操作数据;
  2. #可以在connect的参数中加入autocommit=True ,自动提交
  3. import pymysql
  4. conn = pymysql.connect(
  5. host='127.0.0.1'
  6. port=3306
  7. user='root'
  8. passwd='root'
  9. db='db666'
  10. charset='utf8'
  11. autocommit=Ture
  12. )
  13. cursor= conn.cursor(pymysql.cursors.DictCUrsor)
  14. #增
  15. sql='insert into user(name,password) value(%s,%s)'
  16. #rows = cursor.execute(sql,('jackson',123))
  17. rows = cursor.executemany(sql,[('xxx',123),('ooo'.123)]) #使用列表套元组的方式,一次插入多条数据
  18. print(rows)
  19. conn.commit() #确认
  20. #改
  21. sql='update user set name="jasonNS" where id=1'
  22. rows=cursor.execute(sql)
  23. print(rows)
  24. conn.commit() #确认
  25. #删
  26. sql = 'delete from user where id =7 '
  27. rows = cursor.execute(sql)
  28. print(rows)
  29. conn.commit() #确认
  30. #查
  31. sql = 'select * from user'
  32. rows = cursor.execute(sql)
  33. print(rows)

事务

定义:

  1. 开启一个事务可以包含多条sql语句,这些sql语句要么同时成功,要么都不成功;
  2. 称之为事务的原子性。

作用:

  1. 保证了对数据操作的安全性

事务的四大特性

  1. ACID
  2. A:原子性
  3. 一个事务时一个不可分割的单位,事务中包含的诸多操作要么同时成功要么同时失败。
  4. C:一致性
  5. 事务必须是使数据库从一个一致性的状态变到另外一个一致性的状态,一致性跟原子性是密切相关的
  6. I:隔离性
  7. 一个事务的执行不能被其他事务干扰。
  8. (即一个事务内部的操作及使用到的数据对并发的其他事务是隔离的,并发执行的事务之间也是互相不干扰的)
  9. D:持久性(永久性)
  10. 一个事务一旦提交并执行成功,那么它对数据库中数据的修改应该是永久的,接下来的其他操作或者故障不应该对其有任何的影响

使用事务

  1. #事务相关的关键字
  2. 1. 开启事务
  3. start transaction;
  4. 2.回滚(回到事务执行之前的状态)
  5. rollback;
  6. 3.二次确认(确认之后就无法回滚)
  7. commit;
  8. """模拟转账"""
  9. create table user(
  10. id int primary key auto_increment,
  11. name char(16),
  12. balance int
  13. );
  14. insert into user(name,balance) values
  15. ('jason',1000),
  16. ('egon',1000),
  17. ('tank',1000);
  18. #1 先开启事务
  19. start transaction;
  20. #2 多条sql语句
  21. update user set balance=900 where name='jason';
  22. update user set balance=1010 where name='egon';
  23. update user set balance=1090 where name='tank';
  24. #3 commit; / rollback;

触发器

在满足对表数据进行增、删、改的情况下,自动触发的功能

使用触发器可以实现监控、日志等功能

触发器可以在六种情况下自动触发 增前、增后、删前、删后、改前改后

基本语法结构

  1. create trigger 触发器名称 before/after insert/update/delete on 表名 for each row
  2. begin
  3. sql语句
  4. end
  5. #具体使用 针对触发器的名字,我们通常需要做到见名知意
  6. #针对增
  7. create trigger tri_before_insert before insert on t1
  8. for each row
  9. begin
  10. sql语句
  11. end
  12. ps:修改mysql默认结束符 只作用于当前窗口
  13. delimiter $$ 将默认的结束符号由;改为$$
  14. #删除触发器
  15. drop trigger 触发器名称;

存储过程(了解)

  1. 存储过程就类似于python中的自定义函数
  2. 它的内部包含了一系列可以执行的sql语句,存储过程存放于MySQL服务端中,你可以直接通过调用存储过程触发内部sql语句的执行

基本使用

  1. create procedure 存储过程的名字(形参1,形参2,...)
  2. begin
  3. sql代码
  4. end
  5. #调用
  6. call 存储过程的名字();