热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PyMySQL基本使用以及SQL注入问题

[toc]PyMySQL基本使用以及SQL注入问题PyMySQL基本使用又是一个可以帮助我们实现用代码来操作数据库的模块,安装,导入即可然后导入即可使用只获取查询结果中的一条数据获


目录




  • PyMySQL基本使用以及SQL注入问题

    • PyMySQL基本使用

    • SQL注入问题

    • 数据的增删改查





PyMySQL基本使用以及SQL注入问题

PyMySQL基本使用

又是一个可以帮助我们实现用代码来操作数据库的模块,安装,导入即可

技术分享图片

然后导入即可使用

# pymysql基本使用
import pymysql
cOnn= pymysql.connect(
user='root',
password='123',
host='127.0.0.1',
port=3306,
charset='utf8',
database='db3'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 产生一个游标对象
# 括号中cursor=pymysql.cursors.DictCursor 是将查询出来的结果制作成字典的形式返回
sql = "select * from user_info" # 在pycharm中,加不加分号无所谓,pymysql会自动给你加
res = cursor.execute(sql) # 执行sql语句
# print(res) # ---> 3 execute返回的时候当前sql所影响的行数
# ret = cursor.fetchone() # 只获取查询结果中的一条数据
# ret = cursor.fetchall() # 获取查询结果的所有数据
# ret = cursor.fetchmany(2) # 指定获取几条数据,如果数字超过了也不会报错
# print(ret)
# print(cursor.fetchone())
# print(cursor.fetchone())
# 相对移动
cursor.scroll(2,'relative') # 基于指针所在位置,往后偏移
# 绝对移动
cursor.scroll(1, 'absolute') # 基于起始位置,往后偏移
print(cursor.fetchall())


  • cursor.fetchone() 只获取查询结果中的一条数据

  • cursor.fetchall() 获取查询结果的所有数据

  • cursor.fetchmany(2) 指定获取几条数据




SQL注入问题



  • sql注入问题指的是



    • 利用特殊符号和注释语法,巧妙的绕过真正的sql效验

    技术分享图片

    技术分享图片


  • 解决方法



    • 关键性的数据,不要自己手动去拼接,而是交由execute帮你去拼接


import pymysql
cOnn= pymysql.connect(
user='root',
passwd='123',
db='db3',
host='127.0.0.1',
port=3306,
charset='utf8'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 获取用户输入的用户名和密码,然后去数据库中校验
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# sql = "select * from user_info where username='%s' and password='%s'" % (username,password) # 注意:不要自己拼接
sql = "select * from user_info where username=%s and password=%s"
print(sql)
cursor.execute(sql, (username, password))
res = cursor.fetchall()
if res:
print(res)
else:
print('username or password error')



数据的增删改查

先来个例子再说

import pymysql
cOnn= pymysql.connect(
user = 'root',
passwd = '123',
db = 'db3',
host = '127.0.0.1',
port = 3306,
charset = 'utf8'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 增
sql = "insert into user_info(username,password) values('jason_dsb',111)"
# 改
# sql = "update user_info set username='jason_dsb' where id = 2"
# 删除
# sql = "delete from user_info where id=1"
res = cursor.execute(sql)
print(res) # 结果---> 1

可以发现,每个语句执行结果都是1,证明语句的执行都影响了一条数据,但是发现,数据库数据不变

技术分享图片

why?

because:针对增 删 改 操作,都是对数据库的数据进行了实际操作,执行的重要程度较高,所以,必须要有一步确认操作(commit)



  • conn.commit() 确认当前操作,真正同步到数据库

import pymysql
cOnn= pymysql.connect(
user = 'root',
passwd = '123',
db = 'db3',
host = '127.0.0.1',
port = 3306,
charset = 'utf8'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 增
sql = "insert into user_info(username,password) values('tank_dsb',111)"
# 改
# sql = "update user_info set username='jason_dsb' where id = 2"
# 删除
# sql = "delete from user_info where id=1"
res = cursor.execute(sql)
conn.commit() # 确认当前操作,真正同步到数据库
print(res) # 结果---> 1

技术分享图片



  • 还有一种方式就是,在连接的时候,定义参数autocommit=True 字面翻译就懂了,自动提交确认

import pymysql
cOnn= pymysql.connect(
user = 'root',
passwd = '123',
db = 'db3',
host = '127.0.0.1',
port = 3306,
charset = 'utf8',
autocommit = True #自动提交确认
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 增
# sql = "insert into user_info(username,password) values('tank_dsb',111)"
# 改
# sql = "update user_info set username='jason_dsb' where id = 2"
# 删除
sql = "delete from user_info where id=9"
res = cursor.execute(sql)
# conn.commit() # 确认当前操作,真正同步到数据库
print(res) # 结果---> 1

技术分享图片



  • 总结

    • 第一种方式, 自己手动加 conn.commit()

    • 第二种方式,添加参数autocommit = True



推荐阅读
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • 项目风险管理策略与实践
    本文探讨了项目风险管理的关键环节,包括风险管理规划、风险识别、风险分析(定性和定量)、风险应对策略规划及风险控制。旨在通过系统的方法提升项目成功率,减少不确定因素对项目的影响。 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • 本文详细介绍了iOS应用的生命周期,包括各个状态及其转换过程中的关键方法调用。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
author-avatar
歌歌了_618
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有