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

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语句里面的%s

if 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.kler.cn/a/404088.html

相关文章:

  • Easyexcel(1-注解使用)
  • C语言 蓝桥杯某例题解决方案(查找完数)
  • Android开发实战班 - 现代 UI 开发之自定义 Compose 组件
  • JDK安装和Linux常见设置详细版教程
  • Apache Paimon】-- 6 -- 清理过期数据
  • 在Linux下配置gitee与Github的远程仓库
  • 【定长滑动窗口】【刷题笔记】
  • MySQL深度剖析-全局锁、表锁、行锁
  • JSON.toJSONString(awards) 全是空 [{}{}{}{}{}]
  • .NET高效下载word文件
  • 23 Jumping Back and Forth
  • debian 如何进入root
  • JS推荐实践
  • AI社媒引流工具:解锁智能化营销的新未来
  • Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
  • 排序【数据结构】【算法】
  • EasyExcel并行导出多个excel文件并压缩下载
  • 登上Nature封面!强化学习+卡尔曼滤波上大分
  • 原生安卓和ios开发的app和uniapp开发的app都有什么特点
  • Docker是一个容器化平台注意事项
  • flutter项目苹果编译运行打包上线
  • Matlab 答题卡方案
  • Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容)
  • 时序论文22|ICML24港科大:面向多变量不规则的时间序列预测方法
  • 设计模式学习[8]---原型模式
  • Elasticsearch面试内容整理-常见问题和解决方案