Python之MySql数据库操作增、删、改、查以及SQL 防注入问题

举报
南蓬幽 发表于 2022/04/30 18:38:08 2022/04/30
【摘要】 MySql数据库操作 Python数据库操作环境配置 数据库操作的基本流程 创建 Connection数据库操作对象 创建数据库 连接数据库 创建表 将二维列表数据插入数据库 (1)将数据用多维列表方式存储在内存中 (2)写入数据库、读取数据内容 读取数据库中数据 根据条件读取数据库的信息 修改数据库的信息 删除数据库的信息 SQL 防注入问题 例子 防Sql注入的方法: 1.带参数的Sq...

💨💨💨💨
个人简介:

💦💦💦简介:大三在读,分享一些学习笔记和心得体会
💞💞💞兴趣领域:Python,人工智能,算法和数据结构
👁‍🗨👁‍🗨👁‍🗨格言:逆水行舟,不进则退!
✅✅✅目的:一起进步!
哈喽!大家好呀😁😁我是【南蓬幽】,也可以叫我小幽,小友,小呦等等
如果有不对的地方,欢迎大家指正另外如果觉得不错的话请三连支持一下博主呦💖💖💖
在这里插入图片描述
🎉🎉🎉🎉🎉🎊🎊欢迎大佬们呀🎊🎊🎉🎉🎉🎉🎉🎉

MySql数据库操作

首先在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装

Python数据库操作环境配置

离线安装:

pip install 下载的安装包名

在线安装:
输入以下命令

pip install pymysql

在这里插入图片描述
出现这样说明安装成功!

数据库操作的基本流程

在这里插入图片描述

创建 Connection数据库操作对象

使用Pymysql模块的connect() 方法可生成一个 connection 对象。
connect()参数如下:
• host: 数据库主机名.默认是用本地主机
• user: 数据库登陆名.默认是当前用户
• passwd: 数据库登陆的密码.默认为空
• db: 要使用的数据库名.没有默认值
• port: MySQL服务使用的TCP端口.默认是3306
• charset: 数据库编码
• local_infile: 是否允许读取本地文件

创建数据库

create database 数据库名

在这里插入图片描述

连接数据库

import pymysql

config = {'host': 'localhost',
'port': 3306,
'user': 'root',
'passwd': '密码',
'db' : '数据库名'
}
conn = pymysql.connect( ** config)

创建表

SQL语句:

CREATE TABLE 表名(ID INT NOT NULL AUTO_INCREMENT, name VARCHAR(20) NULL, age INT NULL, score INT NULL, PRIMARY KEY (ID));

使用connection 对象,常用方法:
cursor():创建游标对象。一个游标允许用户执行数据库命令和得到查询结果
excute(sql[, args]):执行一个数据库查询或命令
callproc(func[,args]):调用一个存储过程
fetchone():得到一行记录
fetchall():得到所有行记录
close():关闭对象,关闭后无法再进行操作,除非再次创建连接。

cursor = conn.cursor()
sql = "CREATE TABLE tb_Student(ID INT NOT NULL
AUTO_INCREMENT, name VARCHAR(20) NULL, age INT NULL,
score INT NULL, PRIMARY KEY (ID))"
cursor.execute(sql)
conn.close()

将二维列表数据插入数据库

姓名 年龄 成绩
杨洋 18 90
张艺兴 19 92
彭昱畅 17 89

(1)将数据用多维列表方式存储在内存中

ls = []
ls.append(["杨洋",18,90])
ls.append(["张艺兴",19,92])
ls.append(["彭昱畅",17,89])

(2)写入数据库、读取数据内容

cursor = conn.cursor()
sql = "insert into tb_student(name,age,score) values('{0}',{1},{2})"
try:
  for line in ls:
      cursor.execute(sql.format(*line))
      conn.commit()
except:
      conn.rollback()
finally:
      conn.close()

读取数据库中数据

cursor = conn.cursor()
sql = "select * from tb_student"
cursor.execute(sql)
rows = cursor.fetchall()
ls =list(map(list,rows))
conn.close()
print(ls)

根据条件读取数据库的信息

cursor = conn.cursor()
sql = "select name,age,score from tb_student where score<{0}"
cursor.execute(sql.format(90))
rows = cursor.fetchall()
rows = list(map(list,rows))
print(rows)

修改数据库的信息

cursor = conn.cursor()
sql = "update tb_student set score = 80 where name=%s"
try:
   cursor.execute(sql,["杨洋"])
   conn.commit()
except:
   conn.rollback()

删除数据库的信息

cursor = conn.cursor()
sql = " delete from tb_student where score<%s "
try:
   cursor.execute(sql,[85])
   conn.commit()
except:
   conn.rollback()

SQL 防注入问题

所谓SQL注入,就是通过把SQL命令插入到Web表单提 交或输入域名或页面请求的查询字符串,最终达到欺骗 服务器执行恶意的SQL命令。

例子

user=“root”
password=“123456”

如果知道用户名和密码用以下语句登录验证:

user,pwd = "root","123456"
cursor = conn.cursor()
sql = "select * from tb_login where user = '{0}' and pwd ='{1}' "
cursor.execute(sql.format(user,pwd))
row = cursor.fetchone()
print(row)

肯定是登录验证成功!

但是如果我不知道用户名和密码呢?
我也可以用下面通过验证:

user = "suiyishu' or 1=1 --'"
pwd = "2846946"
cursor = conn.cursor()
sql = "select * from tb_login where user = '{0}' and pwd ='{1}' "
cursor.execute(sql.format(user,pwd))
row = cursor.fetchone()
print(row)

竟然也通过验证了!不可思议!
那到底为什么呢?
‘or 1=1’无论前面输入什么最终用户名验证都是True
'–'跳过密码验证

防Sql注入的方法:

1.带参数的Sql语句 : pymysql模块使用%s来实现

SQL语句参数化是解决SQL注入的最佳解决方案,在程序向数据库发送SQL执
行时,将SQL语句和参数分开传递,动态参数在SQL语句中使用占位符,在数
据库端在填入参数执行,即可规避SQL注入的问题,并提高了数据库执行效率。
• Python支持SQL参数化,动态参数用%s表示,cursor.execute()的第2个参数
位置进行SQL参数的传递,参数类型是tuple, list 或 dict。

user,pwd = "root","123456"
cursor = conn.cursor()
sql = "select * from tb_login where user = %s and pwd =%s "
cursor.execute(sql,(user,pwd))
row = cursor.fetchone()
print(row)

2.使用存储过程

存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外
部程序调用的一种数据库对象。
• 存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库
中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
• 存储过程就是数据库 SQL 语言层面的代码封装与重用。
在stdDB数据库中创建一个存储过程p_login,如下:
CREATE PROCEDURE FindAllStu ( In p_stdID varchar(20))
BEGIN
Select * from StudentInfo where stdID = p_stdID ;
END
PyMysql模块调用存储过程:
cursor.callproc(func[,args]):调用一个存储过程

1、将上述学生信息存入数据库中,表名为tb_score,读取该文件,用合适的数据类型存储文件内容,并打印输出所有内容。

在这里插入图片描述

1.首先创建数据库!

在这里插入图片描述

2.创建表

连接 StdDB数据库

config = {'host': 'localhost',
'port': 3306,
'user': 'root',
'passwd': '1414141',
'db' : 'StDB'
}
conn = pymysql.connect(**config)

执行 SQL 创建 表tb_score

cursor = conn.cursor()
sql = "CREATE TABLE tb_score(ID INT NOT NULL, name VARCHAR(20) NULL,score INT NULL, PRIMARY KEY (ID))"
cursor.execute(sql)
conn.close()

将数据用多维列表方式存储在内存中

ls = []
ls.append([10001, "小明", 90])
ls.append([10002, "小白", 85])
ls.append([10003, "小兰", 83])
ls.append([10004, "小张", 92])
ls.append([10005, "小赵", 81])

多条数据插入数据库中

cursor = conn.cursor()
sql = "insert into tb_score(ID,name,score) values({0},'{1}',{2})"
try:
    for line in ls:
        cursor.execute(sql.format(*line))
    conn.commit()
except:
    conn.rollback()
finally:
    conn.close()

读取数据库中数据

cursor = conn.cursor()
sql = "select * from tb_score"
cursor.execute(sql)
rows = cursor.fetchall()
ls2 = list(map(list, rows))
conn.close()
print(ls2)

在这里插入图片描述

(1)插入一条学生记录信息:学号:10006,姓名:小花,成绩:92

插入一条数据

ls3 = [10006, "小花", 92]
cursor = conn.cursor()
sql = "insert into tb_score(ID,name,score) values({0},'{1}',{2})"
try:
    cursor.execute(sql.format(*ls3))
    conn.commit()
except:
    conn.rollback()
finally:
    conn.close()

在这里插入图片描述

(2)打印输出学生成绩在90分以下的所有学生信息

根据条件读取数据库的信息

cursor = conn.cursor()
sql = "select ID,name,score from tb_score where score<{0}"
cursor.execute(sql.format(90))
rows = cursor.fetchall()
rows = list(map(list, rows))
print(rows)

在这里插入图片描述

(3)删除小明的成绩

删除数据库中的数据

cursor = conn.cursor()
sql = " delete from tb_score where name=%s "
try:
    cursor.execute(sql, ["小明"])
    conn.commit()
except:
    conn.rollback()

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。