python操作MySQL

  1. # 导入第三方模块
  2. import pymysql
  3. # 链接服务端
  4. db = pymysql.connect(
  5. host='127.0.0.1', # MySQL服务的IP地址
  6. port=3306, # MySQL默认PORT端口号
  7. user='root', # 用户名
  8. password='', # 密码(简写:passwd)
  9. database='test', # 数据库名称(简写:db)
  10. charset='utf8' # 字符编码
  11. # autocommit=True # 自动二次确认
  12. )
  13. # 产生获取命令的游标对象
  14. cursor = db.cursor(
  15. cursor=pymysql.cursors.DictCursor
  16. ) # 括号内不写参数,数据是元组要元组 不够精确 添加参数则会将数据处理成字典
  17. sql = 'show tables'
  18. # 执行SQL语句,并返回受影响的行数
  19. affect_row = cursor.execute(sql)
  20. print(affect_row)
  21. # 注意:insert、update、delete 等修改数据的语句需要二次确认
  22. conn_obj.commit() # 手动二次确认
  23. # 获取SQL语句执行后的结果
  24. res = cursor.fetchall()
  25. print(res)

查询数据

  • fetchone():获取查询结果的所有行。将所有行作为元组列表返回。如果没有要获取的记录,则返回一个空列表。
  • fetchmany(size):返回参数指定的行数size。当重复调用时,此方法获取查询结果的下一组行并返回元组列表。如果没有更多行可用,则返回一个空列表
  • fetchall():该方法返回单个行记录,如果没有更多行可用,则返回 None

游标控制

  • cursor.scroll(1, 'relative'):相对于当前位置游标往后移动一个单位
  • cursor.scroll(1, 'absolute'):相对于起始位置游标往后移动一个单位

事务处理

  • 开启事务 db.begin()
  • 提交修改 db.commit()
  • 回滚事务 db.rollback()

SQL注入问题

准备数据

  1. create table admin(username varchar(32),password varchar(32));
  2. insert into admin (username,password) values('kevin','123');

注入问题

  1. import pymysql
  2. db = pymysql.connect(
  3. host='127.0.0.1',
  4. port=3306,
  5. user='root',
  6. password='',
  7. database='test',
  8. charset='utf8'
  9. )
  10. cursor = db.cursor(
  11. cursor=pymysql.cursors.DictCursor
  12. )
  13. username = input("请输入用户名>>>").strip()
  14. password = input("请输入密码>>>").strip()
  15. sql = "select username,password from admin where username = '%s' and password = '%s'" % (username, password)
  16. affect_row = cursor.execute(sql)
  17. res = cursor.fetchall()
  18. if res:
  19. print("登录成功")
  20. else:
  21. print("用户名或密码错误")

这样会导致如果用户输入' or 1=1 #恶意字符串,拼接在SQL语句也会登录成功

  1. select username,password from admin where username = '' or 1=1 #' and password = ''

解决办法

解决SQL注入的问题其实也很简单就是过滤掉特殊符号,execute方法自带校验SQL注入问题 自动处理特殊符号

  1. ssql = "select username,password from admin where username = %s and password = %s"
  2. cursor.execute(sql, (username, password))

补充:以后涉及到敏感数据的拼接全部交给execute方法就好了