欢迎光临
我们一起进阶

python数据库基础-MySQL(五)

扫码或搜索:沉默王二
发送 290992
即可立即永久解锁本站全部文章

事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
事务用来管理insert,update,delete语句
一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

1、事务的原子性:一组事务,要么成功;要么撤回;
   所做的操作,要么成功,要么撤回。
2、稳定性 : 有非法数据(外键约束之类),事务撤回。
   比如说:两个关联的表,当你删除时,是要将两个表关联的数据都删除,可是当你操作后只删除其中一个表的数据,数据库就卡死了,导致没有完全删除,就会撤回。
3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里
   当执行命令到一半时就宕机了,因为宕机也无法撤回,但是当重启后会查看日志,根据日志进行撤回。
  • 在Mysql控制台使用事务来操作

begin; #开始一个事务
insert into a (a) values(555);
rollback; 回滚 , 这样数据是不会写入的
commit; 提交,提交之后就不能撤回了。

查看A表中的数据

mysql> begin;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into A (a) values (6);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> insert into A (a) values (7);
Query OK, 1 row affected (0.00 sec)

mysql> select * from A;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+---+
7 rows in set (0.00 sec)
#查看当前A表的内容,数据已经成功的插入。
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> select * from A;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+---+
5 rows in set (0.00 sec)
#使用回滚后,就恢复了插入数据之前的数据内容。
mysql> insert into A (a) values (6);
Query OK, 1 row affected (0.02 sec)

mysql>
mysql> insert into A (a) values (7);
Query OK, 1 row affected (0.02 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from A;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+---+
7 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from A;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+---+
7 rows in set (0.01 sec)
#commit提交以后,就无法再回滚了

索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。

因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

show index from student;#查看student表的索引

默认表的主键就是索引

索引操作
创建索引
create index index_name on student (name(32));
#创建索引,索引名温蒂index_name;
#on student (name(32)):是针对student这个表来创建索引,引用student的name字段来创建索引,索引hash长度不能超过32(这个长度一般建议使用与字段相同的长度)

可以看到新创建的索引

  • 创建表指定索引
CREATE TABLE mytable( 

ID INT NOT NULL,  

username VARCHAR(16) NOT NULL, 

INDEX [indexName] (username(length)) 

);
  • 删除索引
drop index index_name on student;


已经成功删除了索引

  • 唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

比如主键就可以当做唯一索引,因为主键的值是唯一的。

create unique index index_name on student (id);
#通过id建立唯一索引; 不要使用name等会出现重复值的字段来建立唯一索引。

Mysql Python交互
python-mysqldb
  • python-mysqldb安装

python-mysqldb最后更新时间位2014年,且不能被python3所支持,可以不学习mysqldb。
不过mysqldb与pymysql的操作命令几乎一样。

linux:
yum install MySQL-python

window:
http://files.cnblogs.com/files/wupeiqi/py-mysql-win.zip

pymysql

http://www.cnblogs.com/wupeiqi/articles/5713330.html

参考

  • 下载安装

pip3 install pymysql

  • 使用操作
#授权
grant all on *.* to 'root'@'%' identified by '123qwe';
'''我们通过root进入mysql,然后给root授权,所有源都可以登录(除本地)'''

#更新配置
flush privileges;
#在centos7中关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#示例

import pymysql

# 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')

# 创建游标
cursor = conn.cursor()
'游标就是MySQL中的:"mysql>" 位置'

# 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")

# 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))

# 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])

# 提交,不然无法保存新建或者修改的数据
conn.commit()

# 关闭游标
cursor.close()
# 关闭连接
conn.close()
#在pycharm中执行代码来连接linux
import pymysql

# 创建连接
conn = pymysql.connect(host='192.168.2.202', port=3306, user='aubrey', passwd='123qwe', db='test')

# 创建游标
cursor = conn.cursor()
'''游标就是MySQL中的:"mysql>" 光标位置'''
'''相当于创建一个实例'''

# 执行SQL,并返回收影响行数
effect_row = cursor.execute("select * from student")

#读取数据
print (cursor.fetchone())
'''cursor.fetchone读取一条数据,'''
print (cursor.fetchone())
'''cursor.fetchone接着上一条数据,再往下读取一条数据,'''

执行结果

import pymysql

# 创建连接
conn = pymysql.connect(host='192.168.2.202', port=3306, user='aubrey', passwd='123qwe', db='test')

# 创建游标
cursor = conn.cursor()
'''游标就是MySQL中的:"mysql>" 光标位置'''
'''相当于创建一个实例'''

# 执行SQL,并返回收影响行数
effect_row = cursor.execute("select * from student")

#读取数据
# print (cursor.fetchone())
# '''cursor.fetchone读取一条数据,'''
# print (cursor.fetchone())
# '''cursor.fetchone接着上一条数据,再往下读取一条数据,'''
print ('----------------------------')
print (cursor.fetchall())
'''读取所有数据'''
print (cursor.fetchmany())
'''获取多条数据'''
  • 插入数据
drop table study_record;
'''因为之前student表被关联了study_record表,导致不能修改student表,所以这里删除study_record表'''

alter table student modify id int auto_increment;
'''让student表的id可以自增'''

这是当前student表的数据内容

import pymysql

# 创建连接
conn = pymysql.connect(host='192.168.2.202', port=3306, user='aubrey', passwd='123qwe', db='test')

# 创建游标
cursor = conn.cursor()
'''游标就是MySQL中的:"mysql>" 光标位置'''
'''相当于创建一个实例'''

data = [
    ("N1","2015-05-22",'M'),
    ("N2","2015-05-21",'M'),
    ("N3","2015-05-23",'F')
]

#执行SQL,并返回受影响行数,执行多次
cursor.executemany("insert into student (name,register_date,new_money) values(%s,%s,%s)",data)
'''将data数据插入到student表中'''

conn.commit()
'''提交才能生效'''

成功插入数据到student表中

赞(0) 打赏
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

小白学堂,学的不止是技术,更是前程

关于我们免责声明

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏