数据库学习03--用户权限和python操作Mysql

数据库学习03

一、关系型数据库的数据完整性

关系型数据库设置数据完整性有三种方式

1.实体完整性–没有冗余的记录,每条记录都是独一无二的,(不重复)

实现方式——主键/唯一索引 /唯一约束

2.参照完整性—列的数据要参照其他表中列的数据(主键)

实现方式——外键

3.域完整性—-表里的数据都是有效的数据

实现方式——数据类型 /非空约束 /默认值约束/检查约束

二、用户和权限

1.创建用户

类型 说明
基本语法 Create user ‘用户名’@‘用户地址’ identified by ‘密码’;
示例 Create user ‘test’@‘192.168.10.1’ identified by ‘12345’;
示例说明 创建用户,并且设置密码
mysql -h ip地址 -u用户名 -p
create user 'test'@'ip' identified by '密码'

2.删除用户

类型 说明
基本语法 drop user ‘用户名’@‘用户地址’;
示例 drop user ‘test’@‘192.168.10.1’;
示例说明 删除用户

3.授予权限

类型 说明
基本语法 grant 权限 on . to ‘用户名’@‘用户地址’;
示例 grant 权限 on . to ‘test’@‘192.168.10.1’;
示例说明 给用户权限

4.剥夺权限

类型 说明
基本语法 revoke 权限 on . from ‘用户名’@‘用户地址’;
示例 revoke 权限 on . from ‘test’@‘192.168.10.1’;
示例说明 收回用户权限

-- 创建一个名为hellokitty的新用户,并设置密码为123123
create user 'hellokitty'@'%' identified by '123123';

-- 给hellokitty用户授权
grant all privileges on hrs.tbemp to 'hellokitty'@'%';

-- 从hellokitty召回权限
revoke insert, delete, update on hrs.tbemp from 'hellokitty'@'%';

删除用户jack
drop user jack;

create user 'jackfrued'@'%' identified by '1qaz2wsx';

grant all privileges on *.* to 'jackfrued'@'%' with grant option;

-- 索引相当于是书的目录 它可以用来加速查询(先查目录定位搜索范围)
-- 这是典型的用空间换时间的策略 所以索引要创建在用作查询筛选条件的列上
drop index idx_emp_name on tbemp;
create index idx_emp_name on tbemp (ename);

create unique index uni_emp_name on tbemp (ename);
drop index uni_emp_name on tbemp;

delete from tbdept where deptno=10;


-- start transaction;
-- 开启事务环境
begin;
-- 执行你要做的多个操作(原子性操作)
-- delete from tbemp;
-- 提交让事务生效(结束事务)
commit;
-- 回滚撤销事务(结束事务)
rollback;

三、视图

视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。查询结果的快照。作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。

create view创建视图

四、索引

1.索引是什么

数据库在查询的时候,是一条一条挨着查呢。查询效率太低了。如何提高查询效率?答案就是用索引!索引相当于是书的目录,可以加速查询(先查目录定位搜索范围)数据库,如果在查询的时候,经常通过某个字段查询,那就要考虑给这个字段添加索引这是典型的用空间换时间的策略,所以索引一定要建在用作查询筛选的列上(查询经常用到的列)。

2.索引的缺点

再插入数据的时候效率比较低

3.索引分类

索引类型 功能说明
普通索引 最基本的索引,它没有任何限制
唯一索引 某一行启用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的
主键索引 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码
全文索引 对于需要全局搜索的数据,进行全文索引

4.查看索引

索引类型 功能说明
基本语法 show index from tablename;
示例 show index from user;
示例解释 查看user表的索引结构

5.普通索引

索引类型 功能说明
基本语法 alter table 表 add index(字段)
示例 alter table money add index(username);
示例解释 为money表的username字段增加索引

6.唯一索引

索引类型 功能说明
基本语法 alter table 表 add unique(字段)
示例 alter table money add unique(email);
示例解释 为money表的email字段增加唯一索引

7.主键索引

索引类型 功能说明
基本语法 alter table 表 add primary key(字段)
示例 alter table money add primary key(id);
示例解释 为money表的id字段增加主键索引

8.全文索引

索引类型 功能说明
基本语法 alter table 表 add fulltext(字段)
示例 alter table money add fulltext(content);
示例解释 为money表的content字段增加唯一索引

9。删除索引

索引类型 功能说明
基本语法 ALTER TABLE table_name DROP INDEX index_name ALTER TABLE table_name DROP PRIMARY KEY
示例 alter table money drop index age;
示例解释 为money表删除age索引

【注意】不要用触发器,触发器会锁表

外键约束也尽量少用,用其他手段来确保完整性

创建表时可在创建表语句后加上对应的类型即可声明索引:

primary key(字段) 
index (字段)
fulltext (字段)
unique (字段)
例如:
create table user (
    id int auto_increment,
    name varchar(20),
    primary key(id),
    unique (name)
)engine=innodb default charset=utf8;

五、数据库的导入和导出

数据库里面的表可以导出来,导出来一般都是sql脚本的东西, data.sql
【注】版本问题,通过指令导出和通过不同的可视化工具导出,格式也不一样。

1、MySQL指令导出导入

这是Mysql自带的指令

(1)导出数据库==mysqldump -uroot -p 数据库名>c:\data.sql

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| dudu               |
| homework           |
| hrs                |
| mysql              |
| performance_schema |
| school             |
| srs                |
| sys                |
| user               |
+--------------------+
10 rows in set (0.03 sec)

mysql> exit
Bye

C:\Users\Administrator>mysqldump -uroot -p school>d:\school.sql
Enter password: ******

(2)导入到MySQL==mysql -uroot -p 数据库名<c:\data.sql

mysql> create database diudiu;
Query OK, 1 row affected (0.00 sec)

mysql> quit
Bye

C:\Users\Administrator>mysql -uroot -p diudiu<d:\school.sql
Enter password: ******

2、用Nivicat导出和导入

(1)导出:

右击数据库—>转储SQL文件–>结构和数据

(2)导入

运行SQL文件

六、Python操作数据库

需要用到pymysql

1、检查是否安装了pymysql

(1)cmd中打开python,导入,不保存就代表已经安装

C:\Users\Administrator>python
Python 3.6.4 (v3.6.4:d48eceb,
Type "help", "copyright", "cre
>>> import pymysql

报错就安装pip install

(2).pycharm安装 pip install pymysql==0.9.1

2.用python连接Mysql

用python连接数据库实际上就相当于将python看做是客户端,去连接数据库。(可以想象用nivicat去连接数据库是一样的道理,只是一个可视化客户端一个是代码样式的客户端)

这里有几个方式需要了解

连接 connect方法,括号里要添加参数
游标执行  cursor.execute
做事务部署:
    连接成功要提交 commit
    不成功要回滚  rollback

最后不要忘记关闭数据库

【例1】

# 第一步,连接数据库,类似于指令里面的  mysql -uroot -p
# mysql -h地址 -uroot -p
'''
连接数据库需要用到的参数
主机:host
端口:port
用户名:user
密码:password
指定数据库:db
指定字符集:charset
'''
db = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='dudu', charset='utf8')
# 连接成功之后,得到一个对象
# print(db)
# 首先根据db得到游标,游标就是执行sql语句用到的东西
# cursor = db.cursor()

# 给cursor添加一个参数,让其得到数据是一个字典
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)
# 准备sql语句,执行sql语句
sql = 'select * from star'
# 通过游标执行sql语句,返回结果rows是受影响的行数
rows = cursor.execute(sql)
# print(rows)


# 通过cursor的方法得到数据
# 返回一个元组,元组里面每个元素的值对应的就是数据表中每个字段对应的值
# 获取内容的时候,里面有个迭代器在记录你的位置
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchmany(5))
# print(cursor.fetchmany(5))

# 元组里面套元组
# print(cursor.fetchall())

# 打印得到所有的用户名
ret = cursor.fetchall()
for obj in ret:
    print('我叫%s,我来自%s,我有%s¥' % (obj['name'], obj['province'], obj['money']))
# print(ret)
# 遍历每一个元组
# for tp in ret:
#     print(tp[1])

# 最后呀,要记得关闭
cursor.close()
db.close()

实例2

import pymysql

db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='dudu', charset='utf8')
# print(db)
cursor = db.cursor()
sql = 'select * from start'

# 查询语句,通过try-except,让代码更加健壮
try:
    ret = cursor.execute(sql)
    print(cursor.fetchall())
except Exception as e:
    print(e)
finally:
    cursor.close()
    db.close()

实例3

import pymysql

db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='dudu', charset='utf8')
cursor = db.cursor()

'''
# 准备sql语句
obj = {'name': '李云龙', 'money': '20', 'province': '河南', 'age': 36, 'sex': ''}
# 注意,这里的引号需要加
sql = 'insert into star(name, money, province, age, sex) values("%s", "%s", "%s", "%s", "%s")' % (obj['name'], obj['money'], obj['province'], obj['age'], obj['sex'])
'''

# id = 8
# sql = 'delete from star where id=%s' % id

sql = 'update star set name="马德华" where id=12'

# 注意,没有添加进去,是因为没有提交,需要提交才能成功
try:
    cursor.execute(sql)
    # 提交,写入磁盘
    db.commit()
except Exception as e:
    print(e)
    # 回滚到最初始的状态
    db.rollback()
finally:
    cursor.close()
    db.close()

实例4

import pymysql

class MyMysql(object):
    def __init__(self, host, port, user, password, db, charset):
        self.host = host
        self.port = port
        self.user = user
        self.password = password
        self.db = db
        self.charset = charset
        # 链接数据库
        self.connect()

    def connect(self):
        # 链接数据库和获取游标
        self.db = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password, db=self.db, charset=self.charset)
        self.cursor = self.db.cursor()

    def run(self, sql):
        ret = None
        try:
            ret = self.cursor.execute(sql)
            self.db.commit()
        except Exception as e:
            self.db.rollback()
        finally:
            self.close()
        return ret

    def close(self):
        self.cursor.close()
        self.db.close()

    def insert(self, sql):
        return self.run(sql)

    def update(self, sql):
        return self.run(sql)

    def delete(self, sql):
        return self.run(sql)

    def read_one(self, sql):
        ret = None
        try:
            self.cursor.execute(sql)
            # 获取得到数据
            ret = self.cursor.fetchone()
        except Exception as e:
            print('查询失败')
        finally:
            self.close()
        return ret

    def read_many(self, sql):
        ret = None
        try:
            self.cursor.execute(sql)
            # 获取得到数据
            ret = self.cursor.fetchall()
        except Exception as e:
            print('查询失败')
        finally:
            self.close()
        return ret

猜你喜欢

转载自blog.csdn.net/ZZQHELLO2018/article/details/82530642
今日推荐