操作简介
我们在使用到python进行一些业务操作的时候,经常性的要与数据库进行交互。可能要读取到数据库的表中的数据,也可能需要将一些数据写入到表中,完成数据库的数据更新的操作。此时就需要使用python与数据库进行交互了。
python有着非常强大的库,为python丰富了各种各样的功能,其中就包括了对数据库的操作。在python中如果需要操作mysql数据库,我们需要首先安装对应的库 pip install pymysql
数据库的基本操作
1. 连接到数据库
import pymysql
# 建立与数据库的连接对象,需要指定与数据库的连接相关的属性
db_connection = pymysql.connect(
host="localhost",
port=3306,
user="root",
password="123456",
database="mydb1"
)
# 这个数据库连接对象,在使用结束后,需要调用close来释放资源
db_connection.close()
2. 创建操作对象
# 获取数据库操作对象
# 获取到的是一个光标对象,数据库所有的操作都需要使用这个对象来完成
# 例如:DDL、DML、DQL语句
db_cursor = db_connection.cursor()
# 数据库操作对象在使用结束后,也是需要调用close来释放资源
# 释放需要在数据库连接对象释放之前
db_cursor.close()
3. 执行DDL、DML操作
# 准备执行的SQL语句
sql = "insert into stu values ('S_1012', 'xiaoMing', 34, 'male')"
# 使用数据库操作对象,执行SQL语句
# 执行的返回值是一个数字,表示多少行数据受影响 (affected rows)
db_cursor.execute(sql)
# 在执行DDL、DML操作的时候,最后需要使用commit来提交,才可以影响到数据库中的数据
# 需要使用数据库连接对象来提交
db_connection.commit()
4. 执行DQL操作
# 准备执行的SQL语句
sql = "select * from stu"
# 使用数据库操作对象,执行SQL语句
# 执行的返回值是一个数字,表示查询到了多少行的数据
db_cursor.execute(sql)
# 获取查询到的一行数据,将一行数据存入一个元组返回
# 类似于迭代器,重复调用fetchone的时候,会逐行获取到后续的每一行内容
db_cursor.fetchone()
# 获取查询到的N行数据,默认是1行
# 将查询到的每一行的数据存入一个元组,再将这些元组存入一个大的元组返回
# 即返回的结果是一个二维元组
db_cursor.fetchmany(N)
# 获取查询到的所有的数据
# 将查询到的每一行的数据存入一个元组,再将这些元组存入一个大的元组返回
# 即返回的结果是一个二维元组
db_cursor.fetchall()
SQL注入问题
1. 什么是SQL注入
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
2. SQL注入演示
准备数据
drop table if exists bank_account;
create table bank_account (
id int primary key auto_increment comment '主键',
account_id varchar(18) not null comment '用户账号',
account_balance double(10,2) comment '账户余额',
user_name varchar(20) not null comment '用户名称',
user_pwd varchar(128) unique comment '用户密码',
user_idcard varchar(18) u