mysql用户管理和pymysql
mysql用户管理
为了使不同的人员访问到对应身份的数据库资源,每个人都有不同的权限。
mysql本质上是一款cs软件,它具备用户认证,那么如何实现呢?那就是写入文件,但是在mysql把文件称作表,只有把用户数据写到表中就可以了
权限相关表
自带的mysql数据库,四个表用于存储账户信息以及权限
user: 与用户相关的信息
db: 用户的数据库权限信息
table_peiv,: 用户的表权限
columns_priv: 用户的字段权限
权限优先级
user>db>table_priv>columns_priv
select * form user;
#通过查看对应表格来查看对应的数据
#由于字段会较多,以表格的形式展示,使用\G来进行纵向的显示
select * form user\G;
创建账号语句
create user 用户名@'ip地址' identified by 密码;
create user tom@'192.168.101' identified by '123';
#该语句表面tom只能在101机器上使用,别的机器就无法登录
#用%可以表示在任意机器可用
#操作用户 只能由root账户来进行
#删除 将同时删除所有权限
drop user 用户名@主机地址;
#该方式创建的账号没有任何权限,所有只要了解即可
授权语句
执行时如果账号不存在的话会自动创建账号,所以更加推荐使用
注意:默认只有root才能为其他账号授权
grant all on *.* to tom@'localhost' identified by '123';
#该语句中的all表示增删改查所有权限,但是不包含grant权限
#*.*表示任何数据库 任何表 存储在user表
grant all on *.* to tom@'%' identified by '123';
#host为%表示,该账户可以在任何主机上登录但是不包括localhost
grant all on *.* to tom@'localhost' identified by '123';
#继续执行,上述语句保证localhost也可以登录该账户
grant all on db.* to tom@'localhost' identified by '123';
#db.*表示该用户可以操作db数据库的任何表,存储在db表
grant all on db.t1 to tom@'localhost' identified by '123';
#db.*该用户可以操作db数据库的t1表 存储在table_privi表
grant select(id) on db.t1 to tom@'localhost' identified by '123'
#精确到字段 和 操作级别
#该用户只能查询 db下的t1表
grant all on *.* to tom@'localhost' identified by '123' with grant option;
#with grant option 表示该账户可以将权限授予其他用户
revoke all privileges [column] on db.table from user@'host';
revoke all on day42.table from rese2@localhost;
#收回权限
drop user@'host'
#删除用户
flush privileges;
#刷新权限表,一些时候权限信息可能会有所延迟 可以执行该语句立即刷新权限信息
pymysql模块
pymysql是python提供的一个mysql客户端模块,用于与mysql服务器建立连接,发送查询,并获取结果等。
基本使用
import pymysql
#1.连接服务器,获取连接对象(本质上就是封装好的socket)
conn=pymysql.connect(host='127.0.0.1',#如果是本机,可以忽略
port=3306,#如果没有改过 可以忽略
user='root',#必填
password='123',#必填
db='day46',)#必填
#2.通过连接拿到游标对象
#默认的游标返回的是元祖类型 不方便使用,需要更换字典类型的游标
c=conn.cursor(pymysql.cursors.DictCursor)
#3.执行sql
sql='select *from table1'
res=c.execute(sql)
#查询语句将返回查询的结果数量
#4.提取结果
print(res)#输出结果个数
print(c.fetchall())#输出全部的结果内容
#print(c.fetchone())
#print(c.fetchmany(1))
#5.关闭连接
c.close()
conn.close()
#移动光标 参数1位移动的位置,mode指定 相对或绝对
#游标移动到末尾后无法在读取数据,若需要重复读取数据,需要用scroll来移动游标
#c.scorll(1,mode='absolute')
#c.scorll(-1,mode='relative')
#print(c.fetchall())
#print(c.fetchmany(1))
print(c.fetchone())
print(c.fetchone())
默认开启了事务,如果执行了修改操作,一定记得用连接对象提交事务
sql注入攻击
指的是,一些程序员,在输入数据时,按照sql的语法规范,提交了用于攻击型目的的数据
例如:登录功能,需要用户输入用户名和密码
解决方案:
- 客户端在发送sql给服务器前进行re判断
这样的问题在于一些程序可以模拟客户端直接发送请求给服务器
- 在服务器端将sql交给mysql是作进一步处理,相关的代码其实pymysql已经做了封装
我们只要保证不要自己来拼接sql语句即可,将拼接参数操作交给pymysql.
正常的一个登录功能代码如下:
import pymysql
conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='111'
database='day42'
#autocommit=False #开启自动提交,不常用
)
c=conn.cursor(pymysql.cursors.DictCursor)
name=input('name:')
pwd=input('pwd:')
sql='select *from user where name=%s'
if c.execute(sql,(name,)):#name参数交给模块
print('用户名已存在')
else:
sql2='insert into user values(%s,%s)'
if c.execute(sql2,(name,pwd)):
print('注册成功!')
conn.commit() #调用连接对象的提交函数
else:
print('注册失败')
c.close()
conn.close()
注意:pymysql自动开启了事务,所以我们自己在合适的位置提交
调用存储过程
#创建名为add1的存储过程
delimiter |
create procedure add1(in a int,in b int,out c int)
begin
set c=a+b
end|
delimiter;
#pymysql中调用
import pymysql
conn = pymysql.connect(
host = "127.0.0.1", #如果是本机 可以忽略
port = 3306, # 如果没改过 可以忽略
user = "root", #必填
password = "111", #必填
database = "day42", #必填,
autocommit=True # 开启自动提交 不常用....
)
c.conn.cursor(pymysql.cursors.DictCursor)
c.callproc('add1',(1,2,1212))#@_add1_0 @_add1_1 @add1_2
c.execute('selete @_add1_2')
print(c.fetchone())
#调用存储过程时,传入参数,会自动定义为变量
#命名方式@_过程的名称_参数的索引 从0开始
mysql用户管理和pymysql的更多相关文章
- mysql用户管理和pymysql模块
一:mysql用户管理 mysql是一个tcp的服务器,用于操作服务器上的文件数据,接收用户端发送的指令,而接收指令时就 需要考虑安全问题. 在mysql自带的数据库中有4个表是用于用户管理的,分别是 ...
- Python 42 mysql用户管理 、pymysql模块
一:mysql用户管理 什么是mysql用户管理 mysql是一个tcp服务器,应用于操作服务器上的文件数据,接收用户端发送的指令,接收指令时需要考虑到安全问题, ATM购物车中的用户认证和mysql ...
- mysql事务管理和mysql用户管理
1.什么是事务? 事务是一条或者是一组语句组成一个单元,这个单元要么全部执行,要么全不执行. 2.事务特性:ACID: A:atomicity原子性:整个事务中的所有操作要么全部成功执行,要么全部失败 ...
- Python/MySQL(三、pymysql使用)
Python/MySQL(三.pymysql使用) 所谓pymysql就是通过pycharm导入pymysql模块进行远程连接mysql服务端进行数据管理操作. 一.在pycharm中导入pymysq ...
- 05 数据库入门学习-正则表达式、用户管理、pymysql模块
一.正则表达式 正则表达式用于模糊查询,模糊查询已经讲过了 like 仅支持 % 和 _ 远没有正则表达式灵活当然绝大多数情况下 like足够使用 #语法 select *from table whe ...
- SQL学习笔记六之MySQL数据备份和pymysql模块
mysql六:数据备份.pymysql模块 阅读目录 一 IDE工具介绍 二 MySQL数据备份 三 pymysql模块 一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测 ...
- MySQL数据库篇之pymysql模块的使用
主要内容: 一.pymysql模块的使用 二.pymysq模块增删改查 1️⃣ pymsql模块的使用 1.前言:之前我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库, 那如何在p ...
- MySQL 数据备份,Pymysql模块(Day47)
阅读目录 一.IDE工具介绍 二.MySQL数据备份 三.Pymysql模块 一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https:/ ...
- 数据库-用户管理与pymysql
mysql用户管理 !这是dba的活儿!,但是万一公司没有dba? mysql用户指的是什么? 我们每一次在操作前都需要指定账号和密码,这个账号就是mysql的用户; 为什么要管理? 一个公司不可能只 ...
随机推荐
- CSIC_716_20191206【并发编程理论基础】
进程:正在执行的一个过程,进程是对正在执行过程的一个抽象.区别于程序, 进程的三种状态: 进程是动态的. 就绪态ready: 进程具备运行状态,等待操作系统分配处理器 运行状态running:进 ...
- Jenkins配置gitlab
一.免密公钥登陆1 登陆gitlab 搜ssh Keys 2 添加在Jenkins 服务器本地创建好的公钥 保存完成 也可以手动添加 到/var/opt/gitlab/.ssh/authorized_ ...
- R语言 运算符
R语言运算符 运算符是一个符号,通知编译器执行特定的数学或逻辑操作. R语言具有丰富的内置运算符,并提供以下类型的运算符. 运算符的类型 R语言中拥有如下几种运算符类型: 算术运算符 关系运算符 逻辑 ...
- 【Bootstrap】 框架 栅格布局系统设计原理
前提条件(Bootstrap 自带) 首先使用这个布局之前要定义一下代码: 这行代码如果不懂,可以搜索一下,总之大致意思就是,被定义的元素的内边距和边框不再会增加它的宽度,不加入的话排版会有问题. 不 ...
- LeetCode 620. Not Boring Movies (有趣的电影)
题目标签: 题目给了我们一个 cinema 表格, 让我们找出 不无聊的电影,并且id 是奇数的,降序排列. 比较直接简单的,具体看code. Java Solution: Runtime: 149 ...
- LeetCode刷题笔记-贪心法-格雷编码
题目描述: 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 来源:力扣(Leet ...
- 剑指offer——11旋转数组中最小的数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- 神经网络中使用Batch Normalization 解决梯度问题
BN本质上解决的是反向传播过程中的梯度问题. 详细点说,反向传播时经过该层的梯度是要乘以该层的参数的,即前向有: 那么反向传播时便有: 那么考虑从l层传到k层的情况,有: 上面这个 便是问题所在.因为 ...
- mysql分区管理语句
1.key分区语句: ALTER TABLE order_info PARTITION BY KEY(orderSn) PARTITIONS 127; 2.rang分区语句: ALTER TABLE ...
- enumrate用法
转自*https://www.runoob.com/python/python-func-enumerate.html*侵删 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组 ...