当前位置: 首页 > news >正文

pymysql模块

1.pymysql基本使用

  • 打开数据库连接,
  • 使用cursor()方法获取操作游标
  • 执行SQL语句
  • 获取命令执行的查询结果

1.1 打开数据库连接

# 打开数据库连接
db = pymysql.connect(host='127.0.0.1',user='root',port=3306,password="123",database='db5')

1.2 使用cursor()方法获取操作游标

cursor()方法获取操作游标,同时可以指定参数"cursor=pymysql.cursors.DictCursor"将查询结果以字典的形式返回.不添加的时候,查询的结果以元祖返回

# 使用cursor()方法获取操作游标
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)

1.3 执行SQL语句

执行sql语句之后,返回的是当前sql语句影响的行数

# 定义SQL语句
sql = "select * from emp;"
# 执行SQL语句
res = cursor.execute(sql)  # 返回的是当前sql语句影响的行数
# print(res) => 10

1.4 获取命令执行的查询结果

这三条方法读取数据类似于文件光标的移动,移动到位置之后只能够读取之后的数据.同时可以使用cursor.scroll(1). cursor.scroll(1,"absolute")改变游标所在的位置

  • cursor.fetchone(),获取一条数据
  • cursor.fetchall(),获取所有数据
  • cursor.fetchmany(5),可以指定拿几条
  • cursor.scroll(1),相对于光标所在的位置继续往后移动1
  • cursor.scroll(1,"absolute"),相对于数据的开头所在的位置继续往后移动1
print(cursor.fetchone())  # 只拿一条
cursor.scroll(1)  # 相对于光标所在的位置继续往后移动1
print(cursor.fetchall())  # 拿所有
cursor.scroll(1,"absolute") # 相对于数据的开头所在的位置继续往后移动1
print(cursor.fetchmany(5))  # 可以指定拿几条

2.sql注入及解决方法

SQL注入是一种恶意的攻击技术.攻击者通过在用户输入或是其他数据插入点,插入恶意的SQL语句,利用应用程序对用户输入数据验证不足的漏洞,来欺骗数据库执行非预期的命令.

创建users表

create table users(id int primary key,name varchar(16) not null,age int not null
);alter table users add passwd char(16) not null;insert into users values(1,"zs",10,"123"),(2,"lisi",12,"456"),(3,"wu",13,"3333");

b4c634d3ee90492796f067a22ef082f6.png

sql的语句和输入的参数相关

import pymysql# 打开数据库连接
db = pymysql.connect(host='127.0.0.1',user='root',port=3306,password="123",database='db5')# 使用cursor()方法获取操作游标
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)
"""
cursor=pymysql.cursors.DictCursor 将查询结果以字典的形式返回
"""username = input("输入用户名>>")
passwd = input("输入密码>>")# 定义SQL语句
sql = "select * from users where name='%s' and passwd='%s'"%(username,passwd)
print(sql)
# 执行SQL语句
res = cursor.execute(sql)  # 返回的是当前sql语句影响的行数if res:print("登陆成功!!")print(cursor.fetchall())
else:print("用户名或是密码错误")

8c14fee2a3b046f091122fc9bc3b5aff.png

恶意输入:

5a47c16480894c3994e3244a878d0112.png

5da81531f38540338544f928af4b7389.png 解决方式:

日常生活中很多软件在注册的时候不能含有特殊符号.

敏感的数据不要自己做拼接,书写sql语句时先用%s占位符,之后将需要拼接的数据直接交给execute方法即可

import pymysql# 打开数据库连接
db = pymysql.connect(host='127.0.0.1',user='root',port=3306,password="123",database='db5')# 使用cursor()方法获取操作游标
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)
"""
cursor=pymysql.cursors.DictCursor 将查询结果以字典的形式返回
"""username = input("输入用户名>>")
passwd = input("输入密码>>")# 定义SQL语句
sql = "select * from users where name=%s and passwd=%s"
print(sql)
# 执行SQL语句
res = cursor.execute(sql,(username,passwd))  # 自动识别sql语句里面的%sif res:print("登陆成功!!")print(cursor.fetchall())
else:print("用户名或是密码错误")

b1cabfea72924535a788cbe7791032ee.png

3.pymysql基本操作 

在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。

commit()方法游标的所有更新操作,rollback()方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务.

当前的事务设置的是手动提交,我们要结束事务只能是结束事务或是回滚事务.所以在操作数据的增删改时,都需要提交或是回滚事务,实现的操作才能够对于数据库有效.

# _*_ coding utf-8 _*_
# george
# time: 2024/11/18上午11:03
# name: pymysql基础操作.py
# comment:
import pymysql# 打开数据库连接
db = pymysql.connect(host='127.0.0.1',user='root',port=3306,password="123",database='db5')# 使用cursor()方法获取操作游标
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)# 增
# sql = "insert into users values(%s,%s,%s,%s)"
#
# res = cursor.execute(sql, (4, "zl", 15, "2222"))
# db.commit()  # 确认# 改
# sql2 = "update users set age=%s where name=%s"
# res2 = cursor.execute(sql2, (20, "zs"))
# print(res2)
# db.commit()# 删
try:sql3 = "delete from users where id=%s"res2 = cursor.execute(sql3, (4,))db.commit()print(res2)
except:db.rollback()# 查
# sql4 = "select * from users"
# res2 = cursor.execute(sql4)
# print(cursor.fetchall())

 

 

http://www.lryc.cn/news/489353.html

相关文章:

  • WPF-模板和样式
  • 网络编程 day1.2~day2——TCP和UDP的通信基础(TCP)
  • element ui table 每行不同状态
  • 力扣--LRC 142.训练计划IV
  • windows下,用CMake编译qt项目,出现错误By not providing “FindQt5.cmake“...
  • 【element-tiptap】Tiptap编辑器核心概念----结构篇
  • 半导体工艺与制造篇3 离子注入
  • 利用开源的低代码表单设计器FcDesigner高效管理和渲染复杂表单结构
  • 淘宝 NPM 镜像源
  • i春秋-GetFlag(md5加密,字符串比较绕过)
  • SpringBoot中设置超时30分钟自动删除元素的List和Map
  • 入门车载以太网(6) -- XCP on Ethernet
  • DAY4 网络编程(广播和多线程并发)
  • C++个人复习(4)
  • Dockerhub镜像加速
  • 11.20讲座笔记
  • 网络协议之UDP
  • Elasticsearch面试内容整理-常见问题和解决方案
  • React 表单Form 中的 useForm
  • 用指针函数寻找数组中的最大值与次大值
  • 人工智能在金融领域的创新与应用
  • shell脚本(4)一文解决比较运算符用户交互
  • windows 操作系统下载 Android源码教程
  • 【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量
  • vue3-input 搜索框
  • 记录eslint报错的情况
  • mongodb多表查询,五个表查询
  • Git Bash + VS Code + Windows11 Git命令报错莫名奇妙的问题
  • 湛江市社保卡申领指南:手机获取电子照片回执单号
  • Linux离线安装Docker命令,简单镜像操作