目录
安装pymysql第三方包:
sudo pip3 install pymysql
说明:
- 安装命令使用 sudo pip3 install 第三方包名
- 卸载命令使用 sudo pip3 uninstall 第三方包
- 大家现在使用的虚拟机已经安装了这个第三方包,可以使用: pip3 show pymysql 命令查看第三方包的信息
- pip3 list 查看使用pip命令安装的第三方包列表
pymysql的使用:
-
导入 pymysql 包
import pymysql
-
创建连接对象
调用pymysql模块中的connect()函数来创建连接对象,代码如下:
conn=connect(参数列表) * 参数host:连接的mysql主机,如果本机是'localhost' * 参数port:连接的mysql主机的端口,默认是3306 * 参数user:连接的用户名 * 参数password:连接的密码 * 参数database:数据库的名称 * 参数charset:通信采用的编码方式,推荐使用utf8
连接对象操作说明:
- 关闭连接 conn.close()
- 提交数据 conn.commit()
- 撤销数据 conn.rollback()
-
获取游标对象
获取游标对象的目标就是要执行sql语句,完成对数据库的增、删、改、查操作。代码如下:
# 调用连接对象的cursor()方法获取游标对象 cur =conn.cursor()
游标操作说明:
- 使用游标执行SQL语句: execute(operation [parameters ]) 执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete、select等语句
- 获取查询结果集中的一条数据:cur.fetchone()返回一个元组, 如 (1,'张三')
- 获取查询结果集中的所有数据: cur.fetchall()返回一个元组,如((1,'张三'),(2,'李四'))
- 关闭游标: cur.close(),表示和数据库操作完成
4.pymysql完成数据的查询操作
import pymysql
# 创建连接对象
conn = pymysql.connect(host='localhost', port=3306, user='root', password='mysql',database='python', charset='utf8')
# 获取游标对象
cursor = conn.cursor()
# 查询 SQL 语句
sql = "select * from students;"
# 执行 SQL 语句 返回值就是 SQL 语句在执行过程中影响的行数
row_count = cursor.execute(sql)
print("SQL 语句执行影响的行数%d" % row_count)
# 取出结果集中一行数据, 例如:(1, '张三')
# print(cursor.fetchone())
# 取出结果集中的所有数据, 例如:((1, '张三'), (2, '李四'), (3, '王五'))
for line in cursor.fetchall():
print(line)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
pymysql完成对数据的增删改
import pymysql
# 创建连接对象
conn = pymysql.connect(host='localhost', port=3306, user='root', password='mysql',database='python', charset='utf8')
# 获取游标对象
cursor = conn.cursor()
try:
# 添加 SQL 语句
# sql = "insert into students(name) values('刘璐'), ('王美丽');"
# 删除 SQ L语句
# sql = "delete from students where id = 5;"
# 修改 SQL 语句
sql = "update students set name = '王铁蛋' where id = 6;"
# 执行 SQL 语句
row_count = cursor.execute(sql)
print("SQL 语句执行影响的行数%d" % row_count)
# 提交数据到数据库
conn.commit()
except Exception as e:
# 回滚数据, 即撤销刚刚的SQL语句操作
conn.rollback()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
防止sql注入写法
就是将sql中真实传入的数据参数化
import pymysql
# 创建连接对象
con=pymysql.connect(host='localhost',
port=3306,
user='root',
password='123456',
database='test')
# 获取游标,使用它操作数据库
cursor=con.cursor();
try:
sql = "insert into students(name,age,height,gender) values (%s,%s,%s,%s) "
# args: tuple, list or dict
row_count=cursor.execute(sql,('司马懿',18,1.75,'男'))
print(f'影响行数{row_count}')
con.commit()
except Exception as e:
print(e)
con.rollback()
finally:
# 关闭游标
cursor.close()
# 关闭连接
con.close()
事务和存储引擎:
-- 查看MySQL数据库支持的表的存储引擎
show engines;
说明:
- 常用的表的存储引擎是 InnoDB 和 MyISAM
- InnoDB 是支持事务的
- MyISAM 不支持事务,优势是访问速度快,对事务没有要求或者以select、insert为主的都可以使用该存储引擎来创建表
因此 若不使用事务且频繁查询的表 创建表时候 加上engine=MyISAM
create table ni(id int) engine=MYISAM;
后期修改引擎:alter table 表名 engine = 引擎类型;
- 比如: alter table students engine = 'MyISAM';
MySQL数据库默认采用自动提交(autocommit)模式, 也就是说修改数据(insert、update、delete)的操作
- 开启事务使用 begin 或者 start transaction;
- 提交事务commit
- 回滚事务使用 rollback;
- pymysql 里面的 conn.commit() 操作就是提交事务
- pymysql 里面的 conn.rollback() 操作就是回滚事务
索引:
索引来提高数据库的查询效率
查看表中已有索引:
show index from 表名;
不太明显
show create table xx;
只要带key的都是添加了索引
说明:
- 主键列会自动创建索引
- 外键会自动创建索引
索引的创建:
-- 创建索引的语法格式
-- alter table 表名 add index 索引名[可选](列名, ..)
-- 给name字段添加索引
alter table classes add index my_name (name);
说明:
- 索引名不指定,默认使用字段名
索引的删除:
-- 删除索引的语法格式
-- alter table 表名 drop index 索引名
-- 如果不知道索引名,可以查看创表sql语句
show create table classes;
alter table classes drop index my_name;
验证索引性能操作:
-- 开启运行时间监测:
set profiling=1;
-- 查找第1万条数据ha-99999
select * from test_index where title='ha-99999';
-- 查看执行的时间:
show profiles;
-- 给title字段创建索引:
alter table test_index add index (title);
-- 再次执行查询语句
select * from test_index where title='ha-99999';
-- 再次查看执行的时间
show profiles;
联合索引
一个索引覆盖表中两个或者多个字段,一般用在多个字段一起查询的时候
-- 创建teacher表
create table teacher
(
id int not null primary key auto_increment,
name varchar(10),
age int
);
-- 创建联合索引
alter table teacher add index (name,age);
在使用联合索引的时候,我们要遵守一个最左原则,即index(name,age)支持 name 、name 和 age 组合查询,而不支持单独 age 查询,因为没有用到创建的联合索引。
最左原则示例:
-- 下面的查询使用到了联合索引
select * from stu where name='张三' -- 这里使用了联合索引的name部分
select * from stu where name='李四' and age=10 -- 这里完整的使用联合索引,包括 name 和 age 部分
-- 下面的查询没有使用到联合索引
select * from stu where age=10 -- 因为联合索引里面没有这个组合,只有 name | name age 这两种组合
说明:
- 在使用联合索引的查询数据时候一定要保证联合索引的最左侧字段出现在查询条件里面,否则联合索引失效
- 索引不要过多的创建 且只有数据量大的时候才可使用