MySQL
- 学习目录
- Python DB-API
- Python操作mysql
- MySQL事务
0x01 Python DB-API
- 使用流程
* 引入API模块
* 获取与数据连接
* 执行SQL语句和存储过程
* 关闭数据库连接
0x02 Python操作mysql
- 安装包
* MySQLdb用于Python链接MySQl数据库接口。实现Python数据库API
* 基于MySQL C API上建立连接
- 安装MySQL依赖包
* Example: ``` yum install -y python-devel yum install -y mysql-devel yum install -y gcc ```
- pip 安装 MySQLdb
* MySQLdb只适用python2
* python3之后不支持MySQLdb,使用pymysql包
* python3使用pymysql
* Example: Python2 ``` pip search mysqldb ``` * Example: Python3 ``` pip search pymysql pip install pymysql ```
- Python操作MySQL
* Example: Python操作mysql完整过程 ``` # 创建链接 conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', passwd = '123456', db = 'Database' ) # 创建游标 cursor = conn.cursor() # 执行SQL,并返回值 print_row = cursor.execute('update hosts set host = "192.168.10.111" where id > %s', (1,)) # 按1一条一条取数据 print_input = cursor.fetchone() print(print_input) # 执行SQL,并返回值 print_rw = cursor.executemany('insert into hosts(host, color, id) values(%s, %s)', [('192.168.10.120', 1), ('192.168.10.121'), 2]) # 提交, 不然无法保持新建或修改 conn.commit() # 关闭游标 cursor.close() # 关闭连接 conn.close() ``` * Example: Python操作示例 ``` import pymysql data = [ ("N1", "2018-05-09", 'M'), ("N1", "2018-05-09", 'G'), ("N1", "2018-05-09", 'F'), ] cursor.executemany("insert into student (name, register, gender) value (%s, %s, %s)", data) conn.commit() ```
- SQLAchemy
* 是Python编程语言下的ORM框架,建立在数据库API之上
* 使用关系对象映射数据库操作
* 即:将对象转换成SQL, 在使用数据API执行SQL并获取执行结果
- ORM介绍
* 对象映射关系
* 通过ORM将编程语言的对象模型和数据的关系模型建立映射关系
* 避免直接使用SQL语言
- ORM优点
* 隐藏数据库访问细节,"封闭性"数据库交互,与数据库交互简单,不需考利SQL语句
* 构造固化数据结构变得简单易行
- ORM缺点
* 映射和关联管理, 牺牲性能
- sqlalchemy安装
* 框架SQLAlchemy
* 安装pip install SQLAlchemy pip install pymysql
* 官方参考文档http://docs.sqlalchemy.org/en/latest/intro.html
- 基本使用
* 基本方式创建表create table name ( id integer not null auto_increment, name varchar(40), password varchar(64), primary key (id) )
* 不同数据库API调用方式 ``` # MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> # pymysql mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] # MySQL-Connector mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> # cx_Oracle oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...] # mssql eng = create_engine("mssql+pymssql://mydsn", legacy_schema_aliasing=True) ``` * 基于ORM方式创建表 ``` import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String engine = create_engine("mysql + pymysql://root:123456@127.168.10.120/test", encoding= "utf-8", echo = True) # 生成orm基类 Base = daclarative_base() class User(Base): __tablename__ = 'name' # 表名 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) # 创建表结构 Base.metadata.create_all(engine) ```
0x03 MySQL部分
- MySQL基础
- Example: mysql基本操作
show databases; # 查看库 use test; # 使用test库 show tables \G; # 查看表 select * from test; # 查看test表数据 select * from test\G; # 以树形形式显示单条数据 show create table test; # 查看建表语句 select user(); # 查看当前用户 select database(); # 查看当前库 show mame from test; # 显示数据表属性, 属性类型, 主键等信息 create database test; # 创建库 show create database test; # 查看创建库信息 show index from test; # 显示数据表详细索引信息 create table (id int, name char(12), adress char(20)) commit; # 提交 rollback; # 回滚至上一次提交的位置 show variables like "%auto%" # 显示是否自动提交, on开启 off关闭 insert into test (time, name, id) values ('20180506', 'anChow', '25') # 插入字段 desc test; # 查看表结构 grant all privileges on *.* to 'anChow'@'%' identified by '123456' with grant option; # 授权超级用户 show grants for anChwo; # 查看授权信息 show full processlist # 查看队列 show processlist # 查看队列 flush privliges; # 刷新内存
- Example: mysql操作之创建表
create table student( # 创建student表 id int not null auto_increment, # 字段 id 整型 不能为空, 自增列 name char(40) not null, # 字段 name 字符型 不能为空 age int not null, # 整型 register date, # 日期型 primary key (id) # 主键为id列 );
- Example: mysql操作之插入数据
insert into student (name, age register) values ('anChwo', 20, '2018-05-08 10:20:30')
- Example: mysql操作之select查询
select * from student; # 查询表所有内容 select * from student limit 2; # select * from student limit 2 offset 1; # 忽略第一条,从第二条开始 select * from student where age > 18; # 通过where判断 select * from student where id > 3 and age > 18; # 多条件判断 select * from student name like 'an%'; # 模糊查询 select * from student name like binary '%C%'; #只匹配大写
- Example: mysql操作之查询排序
# ASC 降序 DESC 升序, 默认按升序 select * from student where name like binary anC% order by age desc;
- Example: mysql操作之group by
# 查询age字段,统计出现的次数 select age, count(*) from student group by age; # select *, count(*) from student group by name having count(*)>1; # 求年龄总和 select age, sum(age) from student group by age; # 通过coalesce设置取代null的名称 select coalesec(name, '总数'), sum(age) as Total_Age frp, stidemt group by age with rollup;
- Example: mysql操作之update更新
# 更新id为2的name字段 update student set name='Robin.anChow', age = 18 where id = 2; # 更新日期 update student set register='2018-02-24' where id = 5;
- Example: mysql操作之添加字段
# 增加字段 alter table student add sex enum('M', 'F'); # Modify实现修改字段 alter table student modify sex enum('F', 'M', 'X') not null; # Change实现修改字段 alter table student change sex Man char(32) not null default "x"; # 设置默认值 alter table student modify sex not null default 'Man';
- Example: mysql操作之修改表名
alter table student rename to newstudent;
- Example: mysql操作之删除数据
delete from student where id = 4;
- Example: mysql操作之联合查询
select * from student inner join test on student.id = test.id; # select * from student left join test on student.id = test.id; # select * from student right join test on student.id = test.id; # 并集 select * from student left join test on student.id = test.id union select * from student right join test on student.id = test.id; # select student.*, test.* from student, test where student.id = test.id;
- 事务用处
* 用于处理操作量大, 复杂度高的数据
- 注意点
* 只有Innodb数据库引擎支持数据库或表的事务
* 事务处理可以用来维护数据库完整性,保证批量SQL语句完整执行或全部不执行
* 用来管理insert, update, delete语句
- 满足条件(ACID)
* Atomicity --- 原子性
* Consistency --- 稳定性
* Isolation --- 隔离性
* Durability --- 可靠性
- MySQL事务操作
- Example: 开启事务功能
# 开启事务 mysql> begin; # 插入数据 mysql> insert into student (name) valuess(aaa); # 提交事务 ---> 没问题 mysql> commit; # 回滚事务 ---> 有问题 mysql> rollback;
- 索引
* 特点
--- 高效运行,提高检索速度
* 索引分类
--- 单列索引: 只包含单列
--- 组合索引: 可包含多列
* 含义
--- 一张表,保存主键与索引字段。指向实体表记录
* 缺点
--- 提高查询速度, 同时也降低更新表速度
--- 更新表时, 不仅要保持源数据, 还要保存索引文件
--- 会占用磁盘空间
- 普通索引
* 基本索引, 没任何限制
- Example: mysql操作之创建索引
create index indexname on student(name(32));
- Example: mysql操作之创建表时加索引
create table student( id init not null, name varchar(32) not null, index [indexname] (name(32)) );
- Example: mysql操作之删除索引
drop index [indexname] on student;
- Example: mysql操作之显示索引信息
mysql> show index from student\G
- 唯一索引
* 索引值必须唯一, 允许有空值
* 若是组合索引, 则列值组合必须唯一
0x04
- Example:
来源:https://www.cnblogs.com/RobinChow/p/9001067.html