pymysql模块

1.pymysql基本使用

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

1.1 打开数据库连接

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

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

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

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

1.3 执行SQL语句

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

python 复制代码
# 定义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
python 复制代码
print(cursor.fetchone())  # 只拿一条
cursor.scroll(1)  # 相对于光标所在的位置继续往后移动1
print(cursor.fetchall())  # 拿所有
cursor.scroll(1,"absolute") # 相对于数据的开头所在的位置继续往后移动1
print(cursor.fetchmany(5))  # 可以指定拿几条

2.sql注入及解决方法

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

创建users表

sql 复制代码
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");

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

python 复制代码
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("用户名或是密码错误")

恶意输入:

解决方式:

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

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

python 复制代码
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("用户名或是密码错误")

3.pymysql基本操作

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

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

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

python 复制代码
# _*_ 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())
相关推荐
从以前10 分钟前
准备考试:解决大学入学考试问题
数据结构·python·算法
Ven%26 分钟前
如何修改pip全局缓存位置和全局安装包存放路径
人工智能·python·深度学习·缓存·自然语言处理·pip
枫欢27 分钟前
将现有环境192.168.1.100中的svn迁移至新服务器192.168.1.4;
服务器·python·svn
HEU_firejef28 分钟前
Redis——缓存预热+缓存雪崩+缓存击穿+缓存穿透
数据库·redis·缓存
测试杂货铺1 小时前
UI自动化测试实战实例
自动化测试·软件测试·python·selenium·测试工具·测试用例·pytest
KELLENSHAW1 小时前
MySQL45讲 第三十七讲 什么时候会使用内部临时表?——阅读总结
数据库·mysql
余~~185381628001 小时前
NFC 碰一碰发视频源码搭建技术详解,支持OEM
开发语言·人工智能·python·音视频
苏三有春1 小时前
PyQt实战——使用python提取JSON数据(十)
python·json·pyqt
SelectDB2 小时前
飞轮科技荣获中国电信星海大数据最佳合作伙伴奖!
大数据·数据库·数据分析
allnlei2 小时前
自定义 Celery的logging模块
python·celery