iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >pymysql对数据库基础操作与模拟sq
  • 172
分享到

pymysql对数据库基础操作与模拟sq

操作数据库基础 2023-01-31 06:01:32 172人浏览 安东尼
摘要

本文将介绍python3中的pyMysql模块对mysql进行增,删,改,查日常数据操作;实验的环境ubuntu 16.04 mysql5.7.20 python3.5.2 数据库的安装忽略,如果也是ubuntu可直接通过sudo

本文将介绍python3中的pyMysql模块对mysql进行增,删,改,查日常数据操作;实验的环境ubuntu 16.04 mysql5.7.20 python3.5.2 数据库的安装忽略,如果也是ubuntu可直接通过
sudo apt-get install mysql-server
pymysql是专门用于操作MySQL 的Python模块.python2.x也支持(还有MySQLdb),但在python3中目前只支持pymysql
安装
#pip3 install pymysql

测试数据库名test1 表tb1可通过以下sql创建

create table tb1(id int(5) not null auto_increment primary key,name varchar(30) not null,gender varchar(3) default null,age int(3) default 0)engine=innodb default charset="utf8";

以下测试是基于这个tb1空表
表结构如下:
pymysql对数据库基础操作与模拟sql注入

1、连接数据库

import pymysql

# 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='redhat', db='test1',charset='utf8')
# 创建游标
cursor = conn.cursor()   #元组类型返回

##对数据库操作部分####
cursor.execute("")   #对数据库单条操作操作 直接写sql语句放入括号中
cursor.executemany("") #多条操作
#######

#对操作后的提交
conn.commit()

# 关闭游标
cursor.close()
# 关闭连接
conn.close()

以上就是对数据连接操作过程的模板,
参数说明:
host:连接数据库的地址,本例使用本地数据库127.0.0.1,如若连接远程数据库请开放权限并打开防火墙
port:连接数据端口,默认为3306,默认端口可不填写
user:连接的用户
passWord:连接密码
db:需要操作的数据库
charset:设置数据类型

2、插入数据
a、单条数据插入(写入)
把以下行代码放入上面模板操作部分执行

f = cursor.execute('insert into tb1(name,gender,age) values("san","男",18)')
print(f)     #受影响的行数

运行结果:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
1
Process finished with exit code 0

此时到数据库中登录查询如图:
pymysql对数据库基础操作与模拟sql注入
一条数据插入数据成功.
b、多条插入

infos = [
    ("hehe","女",22),
    ("gege","男",19),
    ("mimi","女",20),
]

f = cursor.executemany('insert into tb1(name,gender,age) values(%s,%s,%s)',infos)
print(f)

运行结果:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
3
Process finished with exit code 0

如图:
pymysql对数据库基础操作与模拟sql注入

多条插入成功;

3、删除数据

f = cursor.execute("delete from tb1 where id = %s",(4,))   #单独删除,多条删除可以通过where条件来决定
print(f)

运行结果:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
1
Process finished with exit code 0

删除id为了的mini信息成功
如图:
pymysql对数据库基础操作与模拟sql注入

4、修改数据(更新)

f = cursor.execute("update tb1 set age='28' where id=3")
print(f)

运行结果:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
1
Process finished with exit code 0

如图:
pymysql对数据库基础操作与模拟sql注入

5、查询数据
a、获取一条数据

f = cursor.execute("select * from tb1")
print(f,cursor.fetchonel())

运行结果:

/usr/bin/python3.5 /home/san//mysqldb/s1.py
3
(1, 'san', '男', 18)
Process finished with exit code 0

b、获取所有数据

f = cursor.execute("select * from tb1")
print(f,cursor.fetchall())

运行结果 :

/usr/bin/python3.5 /home/san/mysqldb/s1.py
3
((1, 'san', '男', 18), (2, 'hehe', '女', 22), (3, 'gege', '男', 28))
Process finished with exit code 0

c、获取多条数据
为了更好的效果往tb1中再多插几条数据:

insert into tb1(name,gender,age) values('while','男',26),('red','女',18),('Ling','女',25),('hile','男',22),('ded','女',28),('emma','女',24);
mysql> select * from tb1;
+----+-------+--------+------+
| id | name  | gender | age  |
+----+-------+--------+------+
|  1 | san   | 男     |   18 |
|  2 | hehe  | 女     |   22 |
|  3 | gege  | 男     |   28 |
|  5 | while | 男     |   26 |
|  6 | red   | 女     |   18 |
|  7 | Ling  | 女     |   25 |
|  8 | hile  | 男     |   22 |
|  9 | ded   | 女     |   28 |
| 10 | emma  | 女     |   24 |
+----+-------+--------+------+
9 rows in set (0.00 sec)

#获取4条数据

f = cursor.execute("select * from tb1")
print(f)
print(cursor.fetchmany(4))

运行结果:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
9
((1, 'san', '男', 18), (2, 'hehe', '女', 22), (3, 'gege', '男', 28), (5, 'while', '男', 26))

Process finished with exit code 0

d、关于查询时的位置(指针)说明
cursor.fetchone() #只拿查询结果中的第一条
cursor.fetchmany(4) #指定从查询结果中取多少条,默认是从第一条开始拿
cursor.fetchall() #取出所有查询结果
问题:当我们fetchall所有结果后或fetchmany指定条结果后如何再获取第一条数据?
例如:
我们在获取了前4条结果后想重新获取第一条数据和全部结果时

f = cursor.execute("select * from tb1")
print(f)
print(cursor.fetchmany(4))
print("#########")
print(cursor.fetchone())
print("#########")
print(cursor.fetchall())

结果如下:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
9
((1, 'san', '男', 18), (2, 'hehe', '女', 22), (3, 'gege', '男', 28), (5, 'while', '男', 26))
#########
(6, 'red', '女', 18)
#########
((7, 'Ling', '女', 25), (8, 'hile', '男', 22), (9, 'ded', '女', 28), (10, 'emma', '女', 24))
Process finished with exit code 0

并非是我们想要的结果,当我们取出前4条再运行fetchone时获取的是第5条数据
再fetchall时是从第5条开始.要想得到我们想要的结果就需要涉及到位置问题或叫指针位置,可以通过以下两个函数来重新获取新的位置;
cursor.scroll(0,mode="absolute") #数字0表示从第一条开始,绝对模式,即把位置指针移动到第一条开始
因此把cursor.scroll(0,mode="absolute") 代码添加到以上print(cursor.fetchmany(4))后面和print(cursor.fetchall())前面;就可以达到我们要的效果;

cursor.scroll(1,mode="relative") #相对模式,即相对于当前位置 ,正数是往后,负数是往前获取
来个实例:

为了便于测试 说明了问题,先往数据中插入id为4的信息,
>insert into tb1(id,name,gender,age) values(4,'min','女',19);
f = cursor.execute("select * from tb1")
print(f)
print("#####获取前4条####")
print(cursor.fetchmany(4))
print("####往后移两条即第7条#####")
cursor.scroll(2,mode="relative")
print(cursor.fetchone())

print("#####往前移动4条即第4条####")
cursor.scroll(-4,mode="relative")
print(cursor.fetchone())

print("####位置移动到第一条开始#####")
cursor.scroll(0,mode="absolute")
print(cursor.fetchall())

运行结果:
pymysql对数据库基础操作与模拟sql注入

tb1表:

mysql> select * from tb1;
+----+-------+--------+------+
| id | name  | gender | age  |
+----+-------+--------+------+
|  1 | san   | 男     |   18 |
|  2 | hehe  | 女     |   22 |
|  3 | gege  | 男     |   28 |
|  4 | min   | 女     |   19 |
|  5 | while | 男     |   26 |
|  6 | red   | 女     |   18 |
|  7 | Ling  | 女     |   25 |
|  8 | hile  | 男     |   22 |
|  9 | ded   | 女     |   28 |
| 10 | emma  | 女     |   24 |
+----+-------+--------+------+
10 rows in set (0.00 sec)

以上是对数据库的基本操作,注意点:
向数据库中写入,删除,修改后需要注意的是必须要conn.commit()提交
查询时尽量避免select * ,数据量大会导致很慢;甚至会死机;

1、简单sql注入
以上的操作没有和用户名交互,比如说插入数据时用的都是硬编码写在程序中
如果我们需要用户输入时就涉及到sql连接问题,先来一个示例:
把tb1增加一列password并修改密码为1234

mysql> alter table tb1 add column password varchar(30) after name;
mysql> update tb1 set password="1234";
Query OK, 10 rows affected (0.03 sec)
Rows matched: 10  Changed: 10  Warnings: 0

mysql> select * from tb1;
+----+-------+----------+--------+------+
| id | name  | password | gender | age  |
+----+-------+----------+--------+------+
|  1 | san   | 1234     | 男     |   18 |
|  2 | hehe  | 1234     | 女     |   22 |
|  3 | gege  | 1234     | 男     |   28 |
|  4 | min   | 1234     | 女     |   19 |
|  5 | while | 1234     | 男     |   26 |
|  6 | red   | 1234     | 女     |   18 |
|  7 | Ling  | 1234     | 女     |   25 |
|  8 | hile  | 1234     | 男     |   22 |
|  9 | ded   | 1234     | 女     |   28 |
| 10 | emma  | 1234     | 女     |   24 |
+----+-------+----------+--------+------+
10 rows in set (0.00 sec)

模拟验证用户名和密码:

sql = 'select name,password from tb1 where name="%s" and password="%s"'
sql = sql %('min',1234)  #正常获取结果
cursor.execute(sql)
result=cursor.fetchone()
print(result)
if result:
    print("login ok")
else:
    print("login fatal!")

运行结果:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
('min', '1234')
1
login ok
Process finished with exit code 0

但我们把密码修改非正确的密码1234时
运行是

None
0
login fatal!

我们把代码 换成以下:

sql = 'select name,password from tb1 where name="%s" and password="%s"'
sql = sql %('min" -- ', 1236)
cursor.execute(sql)
result=cursor.fetchone()
print(result)

if result:
    print("login ok")
else:
    print("login fatal!")

运行结果:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
('min', '1234')
login ok
Process finished with exit code 0

错误的密码竟然也能登录成功,why?先不说why 我们再用错误的用户名和密码试试!

sql = 'select name,password from tb1 where name="%s" and password="%s"'
sql = sql %('lsb" or 1=1 -- ', 1236)

cursor.execute(sql)
result=cursor.fetchone()
print(result)
if result:
    print("login ok")
else:
    print("login fatal!")

结果:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
('san', '1234')
login ok
Process finished with exit code 0

错误填写用户名和密码也能获取第一条正确的数据?why,必须知道why
这其实是一个简单的注入原因在于sql语句不规范,用了字符串拼接,sql中的--是注释
sql = sql %('min" -- ', 1236) 被替换成
sql = 'select name,password from tb1 where name='min -- " and password="1236"'
从--之后都被注释了,变成 了
select name,password from tb1 where name='min';
而用错误 的用户名 ql = sql %('lsb" or 1=1 -- ', 1236)时被替换成
sql = 'select name,password from tb1 where name='lsb or 1=1 -- " and password="1236"'
成为select name,password from tb1;

解决 方案:
规范操作sql语句

cursor.execute('select name,password fromt b1 where name=%s and password=%s',('min',1234))
result= cursor.fetchone()
print(result)

这里再输入错误字符时转换成

info=('min" -- ',1234)
cursor.execute('select name,password from tb1 where name=%s and password=%s',info)
result=cursor.fetchone()
print(result)
if result:
    print("login ok")
else:
    print("login fatal!")

执行结果没有问题:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
None
login fatal!
Process finished with exit code 0

而正确的用户名和密码就会登录成功没有问题!

2、修改游标类型
默认的获取数据的类型是元组,只能通过索引去获取,要是有一种方案能直接通过键获取值不是很好?
pymysql提供了方案,修改游标返回类型
修改获取为字典类型

cursor = conn.cursor(pymysql.cursors.DictCursor)  #字典类型
f = cursor.execute("select * from tb1")
print(f)
print(cursor.fetchall())

运行结果:

/usr/bin/python3.5 /home/san/mysqldb/s1.py
10
[{'id': 1, 'gender': '男', 'name': 'san', 'password': '1234', 'age': 18}, {'id': 2, 'gender': '女', 'name': 'hehe', 'password': '1234', 'age': 22}, {'id': 3, 'gender': '男', 'name': 'gege', 'password': '1234', 'age': 28}, {'id': 4, 'gender': '女', 'name': 'min', 'password': '1234', 'age': 19}, {'id': 5, 'gender': '男', 'name': 'while', 'password': '1234', 'age': 26}, {'id': 6, 'gender': '女', 'name': 'red', 'password': '1234', 'age': 18}, {'id': 7, 'gender': '女', 'name': 'Ling', 'password': '1234', 'age': 25}, {'id': 8, 'gender': '男', 'name': 'hile', 'password': '1234', 'age': 22}, {'id': 9, 'gender': '女', 'name': 'ded', 'password': '1234', 'age': 28}, {'id': 10, 'gender': '女', 'name': 'emma', 'password': '1234', 'age': 24}]

Process finished with exit code 0

以上就是python3通过pymysql模块操作mysql的基础操作和需要注意力的事项,以防注入;如有不当之处 欢迎指正 !

您可能感兴趣的文档:

--结束END--

本文标题: pymysql对数据库基础操作与模拟sq

本文链接: https://www.lsjlt.com/news/190126.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • pymysql对数据库基础操作与模拟sq
    本文将介绍python3中的pymysql模块对mysql进行增,删,改,查日常数据操作;实验的环境Ubuntu 16.04 mysql5.7.20 python3.5.2 数据库的安装忽略,如果也是ubuntu可直接通过sudo ...
    99+
    2023-01-31
    操作 数据库 基础
  • 调用pymysql模块操作数据库
    1、创建数据库表: 1 def create_table(tb_name): 2 import pymysql#导入模块 3 #连接数据库 4 db = pymysql.Connect('localhos...
    99+
    2023-01-31
    模块 操作 数据库
  • 【Mysql】数据库基础与基本操作
    🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘。 🛸Mysql专栏:Mys...
    99+
    2023-08-16
    mysql
  • 【Python】系列模块之pymysql操作MySQL 数据库
    目录 一、安装pymysql 二、连接数据库 三、数据库操作 3.1 查询 3.2 更新 3.3 使用循环批量更新  Python 系列文章学习记录:  Python系列之Windows环境安装配置_开着拖拉机回家的博客-CSDN博客 ...
    99+
    2023-09-03
    数据库 python mysql pymysql
  • python怎么操作pymysql数据库
    本篇内容主要讲解“python怎么操作pymysql数据库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python怎么操作pymysql数据库”吧!一、安装pip install&n...
    99+
    2023-06-30
  • Python数据库操作 ---- pymysql教学
    文章目录 前提准备连接数据库创建数据库创建数据表、插入数据查询数据更新数据删除数据实战应用总结 前提准备 安装mysql 在使用pymysql的前提就是又一个mysql数据库,这个数据库可以是本地数据库也可以是远程的数据...
    99+
    2023-08-18
    数据库 mysql sql
  • pymysql操作mysql数据库的方法
    目录前言1、pymysql.connent2、conn.cursor()3、cursor.execute()4、cursor.executemany()5、cursor.fetchone()6、cursor.scroll...
    99+
    2023-04-19
    pymysql操作mysql数据库 pymysql操作mysql
  • Python基础之操作MySQL数据库
    目录一、数据库操作1.1 安装PyMySQL1.2 连接数据库1.3 创建数据表1.4 插入,查询数据1.5 更新,查询数据1.6 删除,查询数据二、连接与游标对象的方法2.1 连接...
    99+
    2024-04-02
  • Java基础之JDBC的数据库连接与基本操作
    目录一、JDBC概述二、JDBC操作数据库、操作表步骤三、JDBC体系结构与JDBC API四、注册与加载驱动五、建立连接(Connection)六、使用PreparedStatem...
    99+
    2024-04-02
  • mysql操作数据库基础详解
    目录一、介绍二、SQL分类三、基本操作创建查询修改删除使用数据库一、介绍 MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这...
    99+
    2022-11-13
    mysql 操作数据库基础 mysql 操作数据库
  • 【MySQL】基础实战篇(1)—数据库与数据表的操作
    创建管理数据库创建数据库查看与选择数据库修改数据库删除数据库 创建管理数据表创建数据表查看数据修改数据表删除数据表 创建管理数据库 创建数据库 语法: CREATE...
    99+
    2023-09-27
    数据库 mysql oracle
  • Python操作MySQL数据库—pymysql库(可直接使用的模板通用操作)
    Python与MySQL数据库交互 1.DB-API:(DB是data;API是方法,接口) Python与数据库的交互: 在没有DB-API之前,各数据库之间的应用接口非常混乱,实现各不相同,如果项目需要更换数据库,基本上需要把所有和...
    99+
    2023-08-16
    mysql python pymysql库
  • python 实现 pymysql 数据库操作方法
    目录一、安装二、连接数据库三、创建数据库四、创建数据表五、插入一条数据六、插入多条数据七、数据统计八、获取表名信息九、获取单条数据十、查询多条数据十一、查询所有数据十二、上下文管理一...
    99+
    2024-04-02
  • HTML5本地数据库的基础操作
    这篇文章主要介绍“HTML5本地数据库的基础操作”,在日常操作中,相信很多人在HTML5本地数据库的基础操作问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HTML5本地数据库...
    99+
    2024-04-02
  • python数据库操作之PyMysql怎么使用
    本文小编为大家详细介绍“python数据库操作之PyMysql怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“python数据库操作之PyMysql怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。P...
    99+
    2023-07-05
  • 【python】flask+pymysql 实现Web端操作数据库!
    Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。 Flask也被称为 “microframework” ,因为它...
    99+
    2023-10-25
    python flask 后端 1024程序员节
  • Python基于pymysql的数据库操作类的安装运行过程
    这期内容当中小编将会给大家带来有关Python基于pymysql的数据库操作类的安装运行过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 一...
    99+
    2024-04-02
  • MongoDB数据库基础操作的示例分析
    这篇文章将为大家详细讲解有关MongoDB数据库基础操作的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。为了保存网站的用户数据和业务数据,通常需要一个数据库。Mo...
    99+
    2024-04-02
  • MySQL数据库基础操作命令有哪些
    这篇文章给大家分享的是有关MySQL数据库基础操作命令有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、使用帮助信息登陆数据库就不介绍了哦,比如说想做创建的数据库的操作,不...
    99+
    2024-04-02
  • 详解MongoDB数据库基础操作及实例
    详解数据库基础操作及实例           废话不多说,直接上代码,注释写的比较清楚,大家参考下,  示...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作