pymysql操作数据库与索引

目录

  • pymysql操作数据库

    • 简单操作
    • sql的注入问题
    • sql注入问题解决办法
      • sql注入问题模板总结
    • 利用pymysql操作数据库 (增删改),conn.commit()
  • 索引
    • 1.为何要有索引
    • 2.什么是索引?
    • 3.索引使用的优缺点
    •  4.索引原理
    • 5.索引的种类
    • 索引的创建
      • 主键索引
      • 唯一索引
      •  普通索引

pymysql操作数据库

简单操作

import pymysql  # pip install pymysql

# 连接数据库的参数
conn = pymysql.connect(host= 'localhost',
                       user='root',
                       password = '123',
                       database='db3',
                       charset = 'utf8')
# cursor = conn.cursor()  # <pymysql.cursors.Cursor object at 0x000000000A0E2C50>,游标对象,默认返回的值是元祖类型

cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)  # <pymysql.cursors.DictCursor object at 0x000000000A0E2C88> 返回的值是字典类型
# print(cursor)
sql = "select name from userinfo where id>10"

cursor.execute(sql)
res= cursor.fetchall() # #取出所有的数据 返回的是列表套字典
# res = cursor.fetchone()  # 只获取一条数据
# res = cursor.fetchmany(size)   # 可指定参数, 取出size条数据 返回的是列表套字典
print(res)
cursor.close()
conn.close()
'''
[{'name': '丁丁'}, {'name': '星星'}, {'name': '格格'}, {'name': '张野'}, {'name': '程咬金'}, {'name': '程咬银'}, {'name': '程咬铜'}, {'name': '程咬铁'}]
'''

sql的注入问题

import pymysql

user = input('输入用户名:').strip()
password = input('输入密码:').strip()

# 连接数据库的参数
conn = pymysql.connect(host= 'localhost',
                       user='root',
                       password = '123',
                       database='db3',
                       charset = 'utf8')
# cursor = conn.cursor()  # <pymysql.cursors.Cursor object at 0x000000000A0E2C50>,游标对象,默认返回的值是元祖类型

cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)  # <pymysql.cursors.DictCursor object at 0x000000000A0E2C88> 返回的值是字典类型
# print(cursor)
sql = "select * from user where name='%s' and password='%s'"%(user,password)
print(sql)
# exit()
cursor.execute(sql)
res= cursor.fetchall() # #取出所有的数据 返回的是列表套字典
# res = cursor.fetchone()  # 只获取一条数据
# res = cursor.fetchmany(size)   # 可指定参数, 取出size条数据 返回的是列表套字典
print(res)
if res:
    print('登录成功!')
else:
    print('登录失败!')

cursor.close()
conn.close()
'''
输入用户名:zhang' #
输入密码:123

select * from user where name='zhang' #' and password='123'
[{'name': 'zhang', 'password': '123   '}]
登录成功!
'''
'''
输入用户名:zhang' or 1=1 #
输入密码:123

select * from user where name='zhang' or 1=1 #' and password='123'
[{'name': 'zhang', 'password': '123   '}]
登录成功!
'''
# 输入用户名的时候,输入‘#’将后面的密码验证部分注释掉了,语句变成了select * from user where name='zhang' 或者 select * from user where name='zhang' or 1=1,直接跳过了密码的验证环节,出现了sql语句的注入问题。

sql注入问题解决办法

# 出现sql注入问题主要是我们对用户输入没有做合法性验证,
# 方法1:如果对用户输入的值进行判断或者转译,检查完之后或者转译后就不会出现此类问题了。这样低级安全问题不该出现!
# 方法2:将参数以元组或列表的形式传入execute中,让它帮我们转译和检验;即:cursor.execute(sql,(user,password))

import pymysql

user = input('输入用户名:').strip()
password = input('输入密码:').strip()

# 连接数据库的参数
conn = pymysql.connect(host= 'localhost',
                       user='root',
                       password = '123',
                       database='db3',
                       charset = 'utf8')
# cursor = conn.cursor()  # <pymysql.cursors.Cursor object at 0x000000000A0E2C50>,游标对象,默认返回的值是元祖类型

cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)  # <pymysql.cursors.DictCursor object at 0x000000000A0E2C88> 返回的值是字典类型
# print(cursor)
sql = "select * from user where name=%s and password=%s"
print(sql)
# exit()
cursor.execute(sql,(user,password))

res= cursor.fetchall() # #取出所有的数据 返回的是列表套字典
# res = cursor.fetchone()  # 只获取一条数据
# res = cursor.fetchmany(size)   # 可指定参数, 取出size条数据 返回的是列表套字典
print(res)
if res:
    print('登录成功!')
else:
    print('登录失败!')

cursor.close()
conn.close()

'''
输入用户名:zhang
输入密码:123
select * from user where name=%s and password=%s
[{'name': 'zhang', 'password': '123   '}]
登录成功!
'''

'''
输入用户名:zhang' #
输入密码:123
select * from user where name=%s and password=%s
()
登录失败!
'''

sql注入问题模板总结


        产生的原因:
            因为过于相信用户输入的内容, 根本没有做任何的检验

        解决的方法:
            sql = "select * from user where name=%s and password=%s"

            # execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了
            cursor.execute(sql, (user, pwd))

        连接:
            ### 连接数据库的参数
            conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8')
            # cursor = conn.cursor() ### 默认返回的值是元祖类型
            cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)

        查:
            fetchall() : 取出所有的数据 返回的是列表套字典
            fetchone() : 取出一条数据 返回的是字典
            fetchmany(size) : 取出size条数据 返回的是列表套字典

利用pymysql操作数据库 (增删改),conn.commit()

# 插入
import pymysql
# 连接数据库的参数
conn = pymysql.connect(host= 'localhost',
                       user='root',
                       password = '123',
                       database='db3',
                       charset = 'utf8')

cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) 

sql = "insert into user(name,password) values(%s,%s)"

print(sql)  # insert into user(name,password) values(%s,%s)

# cursor.execute(sql,("tank",'qwe'))  # 插入单条

data=[('小王','111'),('小张','222'),('小李','333'),('小张','444'),]
cursor.executemany(sql,data)  # 插入多条

conn.commit()

cursor.close()
conn.close()
# 插入单条情况下
'''
mysql> select * from user;
+-------+----------+
| name  | password |
+-------+----------+
| zhang | 123      |
| tank  | qwe      |
+-------+----------+
2 rows in set (0.00 sec)
'''
# 插入多条情况下
'''
mysql> select * from user;
+--------+----------+
| name   | password |
+--------+----------+
| zhang  | 123      |
| tank   | qwe      |
| tank   | qwe      |
| 小王   | 111      |
| 小张   | 222      |
| 小李   | 333      |
| 小张   | 444      |
+--------+----------+
7 rows in set (0.00 sec)
'''
# 修改
先给user表增加一个id索引字段;
mysql> alter table user add id int primary key auto_increment FIRST;
Query OK, 0 rows affected (0.50 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from user;
+----+--------+----------+
| id | name   | password |
+----+--------+----------+
|  1 | zhang  | 123      |
|  2 | tank   | qwe      |
|  3 | tank   | qwe      |
|  4 | 小王   | 111      |
|  5 | 小张   | 222      |
|  6 | 小李   | 333      |
|  7 | 小张   | 444      |
+----+--------+----------+
7 rows in set (0.00 sec)

# 进行修改操作 将 id=6 的记录的 name 字段的名字修改为 ‘小李子’
import pymysql

# 连接数据库的参数
conn = pymysql.connect(host= 'localhost',
                       user='root',
                       password = '123',
                       database='db3',
                       charset = 'utf8')
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
sql = "update user set name = %s where id = %s"
cursor.execute(sql,('小李子',6))  # 插入多条
conn.commit()

cursor.close()
conn.close()

'''
mysql> select * from user;
+----+-----------+----------+
| id | name      | password |
+----+-----------+----------+
|  1 | zhang     | 123      |
|  2 | tank      | qwe      |
|  3 | tank      | qwe      |
|  4 | 小王      | 111      |
|  5 | 小张      | 222      |
|  6 | 小李子    | 333      |
|  7 | 小张      | 444      |
+----+-----------+----------+
7 rows in set (0.00 sec)
'''
# 删除
import pymysql
# 连接数据库的参数
conn = pymysql.connect(host= 'localhost',
                       user='root',
                       password = '123',
                       database='db3',
                       charset = 'utf8')

cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
sql = "delete from user where id>%s"
cursor.execute(sql,6)  # 插入多条
conn.commit()

cursor.close()
conn.close()
'''
mysql> select * from user;
+----+-----------+----------+
| id | name      | password |
+----+-----------+----------+
|  1 | zhang     | 123      |
|  2 | tank      | qwe      |
|  3 | tank      | qwe      |
|  4 | 小王      | 111      |
|  5 | 小张      | 222      |
|  6 | 小李子    | 333      |
+----+-----------+----------+
6 rows in set (0.00 sec)
'''

索引

1.为何要有索引

一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了

2.什么是索引?

索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能
非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。
索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。

3.索引使用的优缺点

若索引太多,应用程序的性能可能会受到影响。而索引太少,对查询性能又会产生影响,要找到一个平衡点,这对应用程序的性能至关重要。当然索引也并不是越多越好,我曾经遇到过这样一个问题:某台MySQL服务器iostat显示磁盘使用率一直处于100%,经过分析后发现是由于开发人员添加了太多的索引,在删除一些不必要的索引之后,磁盘使用率马上下降为20%。可见索引的添加也是非常有技术含量的。

优点:提高查询效率;缺点:加了索引之后,会占用大量的磁盘空间

 4.索引原理

B+树

本质是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据

# 插入3000,000条数据做实验   哈哈哈哈 !!!!

import pymysql

# 连接数据库的参数
conn = pymysql.connect(host= 'localhost',
                       user='root',
                       password = '123',
                       database='db3',
                       charset = 'utf8')

cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
l=[]
for i in range(3000000):

    res=(f'小张{i}',str(i))
    l.append(res)

sql = "insert into user(name,password) values(%s,%s)"

cursor.executemany(sql,l)  # 插入多条
conn.commit()

cursor.close()
conn.close()

'''
| 1033019 | 小张2829      | 2829     |
| 1033020 | 小张2830      | 2830     |
| 1033021 | 小张2831      | 2831     |
| 1033022 | 小张2832      | 2832     |
| 1033023 | 小张2833      | 2833     |
| 1033024 | 小张2834      | 2834     |
| 1033025 | 小张2835      | 2835     |
| 1033026 | 小张2836      | 2836     |
| 1033027 | 小张2837      | 2837     |
| 1033028 | 小张2838      | 2838     |
| 1033029 | 小张2839      | 2839     |
| 1033030 | 小张2840      | 2840     |
| 1033031 | 小张2841      | 2841     |
| 1033032 | 小张2842      | 2842     |
| 1033033 | 小张2843      | 2843     |
| 1033034 | 小张2844      | 2844     |
| 1033035 | 小张2845      | 2845     |
| 1033036 | 小张2Ctrl-C -- sending "KILL QUERY 1" to server ...
846   Ctrl-C -- query aborted.
   | 2846     |
+---------+---------------+----------+
3000006 rows in set (2.46 sec)
'''

5.索引的种类

    索引的种类:(**************************)

        主键索引: 加速查找 + 不能重复 + 不能为空 primary key
        唯一索引: 加速查找 + 不能重复    unique(name)
            联合唯一索引:unique(name, email)
                例子:
                    zekai [email protected]
                    zekai [email protected]

        普通索引: 加速查找   index (name)
            联合索引: index (name, email)

索引的创建

主键索引

主键索引:

                新增主键索引:
                    create table xxx(
                        id int auto_increment ,
                        primary key(id)
                    )
                    改:
                    alter table xxx change id id int auto_increment primary key;
                    alter table xxx modify id int auto_increment primary key; # 同上
                    alter table t1 add primary key (id);

                删除主键索引:
                    mysql> alter table t1 drop primary key;
                    

唯一索引

唯一索引:

                新增:
                    1.
                    create table t2(
                        id int auto_increment primary key,
                        name varchar(32) not null default '',
                        unique u_name (name)
                    )charset utf8

                    2.
                    CREATE  UNIQUE   INDEX  索引名 ON 表名 (字段名) ;
                        create  unique index ix_name on t2(name);

                    3.
                    alter table t2 add unique index ix_name (name)

                删除:
                    alter table t2 drop index u_name;

 普通索引

普通索引:   

                新增:
                    1.
                    create table t3(
                        id int auto_increment primary key,
                        name varchar(32) not null default '',
                        index u_name (name)
                    )charset utf8

                    2.
                    CREATE  INDEX  索引名 ON 表名 (字段名) ;
                        create   index ix_name on t3(name);

                    3.
                    alter table t3 add  index ix_name (name)

                删除:
                    alter table t3 drop index u_name;

原文地址:https://www.cnblogs.com/zhangchaocoming/p/11774846.html

时间: 2024-10-08 22:14:01

pymysql操作数据库与索引的相关文章

pymysql 操作数据库

一.简介 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同,但目前pymysql支持python3.x而后者不支持3.x版本 其执行语句与sql源码相似 二.使用 1.安装 pip install pymysql 2.使用操作 先来一例完整的连接加基本的操作 import pymysql # 创建连接 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', d

MySQL-注释-Navicat基本使用-复杂查询练习题-解题思路-pymysql操作数据库-SQL注入-05

目录 mysql语句注释 navicat 的基本使用 特色(个人总结) 与数据服务器建立连接 创建&打开数据库.表 创建 打开 修改操作表结构 修改表结构 查询修改操作表数据 基本语句对应的操作 模型 ***** 特色功能 从数据库建立模型 模型页面基本操作 用模型设计数据库并导出 结构.数据导入导出 导出 导入 附属小功能 刷新小按钮 查看操作对应sql语句 执行时间查看 手动筛选数据 练习 数据准备 使用SQL语句导入表结构与数据 如何验证答案是否正确 题目 部分参考答案(只放了两题的) 少

pymysql操作数据库

pymysql.connect()参数说明:(连接数据库时需要添加的参数)host(str): MySQL服务器地址port(int): MySQL服务器端口号user(str): 用户名passwd(str): 密码db(str): 数据库名称charset(str): 连接编码 connect()对象支持的方法:cursor() 使用该连接创建并返回游标commit() 提交当前事务rollback() 回滚当前事务close() 关闭连接 cursor对象支持的方法:execute(op)

python 全栈 数据库 (三) python操作数据库

python 操作MYSQL数据库主要有两种方式: 使用原生模块:pymysql ORM框架:SQLAchemy 一.pymysql 1.1下载安装模块 第一种:cmd下:执行命令下载安装:pip3 install pymysql 第二种:IDE下pycharm python环境路径下添加模块 1.2使用操作 #导入模块 import pymysql #建立连接通道,建立连接填入(连接数据库的IP地址,端口号,用户名,密码,要操作的数据库,字符编码) conn = pymysql.connect

联合分组、子查询、视图、事务、python操作mysql、索引

目录 联合分组.子查询.视图.事务.python操作mysql.索引 一.联合分组 二.子查询 三.all 与any:区间修饰条件 四.视图:view 视图的增删改 五.事务 5.1.事务的概念 5.2.事务的四大特性 六.pymysql 模块:python操作mysql 6.1 安装pymysql 模块 6.2 python用pymysql 操作mysql步骤 6.3 游标操作 6.4 pymysql事务 6.5 sql注入 七.索引 联合分组.子查询.视图.事务.python操作mysql.

Django的orm操作数据库

Django的orm操作数据库 django学习链接:https://www.cnblogs.com/clschao/articles/10526431.html 单表操作学习链接:https://www.cnblogs.com/clschao/articles/10427807.html about mvc或者mvc框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,

Python操作数据库(mysql redis)

一.python操作mysql数据库: 数据库信息:(例如211.149.218.16   szz  123456) 操作mysql用pymysql模块 #操作其他数据库,就安装相应的模块 import  pymysql ip='211.149.218.16' port=3306 passwd='123456' user='root' db='szz' conn=pymysql.connect(host=ip,user=user,port=port,passwd=passwd,db=db,cha

关于数据库“事务”“索引”“实例”的含义

在学习数据库的时候经常听见"事务""索引""实例"等术语,那么他们具体是什么意思呢? 事务 事务:是指一个完整的操作过程.在这个过程中任何一个环节出现"意外",那么这个操作过程将会被回滚.事务经常被银行中的数据库使用. 例如:用户A向用户B转账100块,这时需要使用事务.首先,系统会从用户A的账户中扣除100块,然后在用户B的账户中增加100块.如果整过操作都成功,那么最终事务完成,转账成功.如果,某一步出现"意外&

MySql数据库基础操作——数据库、用户的创建,表的制作、修改等

MySql 是一款使用便捷.轻量级的数据库.因为他体积小.速度快.安装使用简单.开源等优点,目前是使用最广泛的数据库.目前位于Oracle甲骨文公司旗下.那今天我们就来介绍一下数据库的基本操作.具体介绍通过指令的方式来操作数据库. 首先,连接数据库的软件很多,比如说 Navicat 等软件.通过这些软件可以轻松便捷的操作数据库,但是今天的重点不在这. 我们今天普及一下指令操作的方式操作MySql数据库. 我们主要从以下 4 个方面介绍: 1.数据库的 创建.删除.查询 等语句 跳转 2.用户的