数据库-用户管理与pymysql
mysql用户管理
!这是dba的活儿!,但是万一公司没有dba?
mysql用户指的是什么?
我们每一次在操作前都需要指定账号和密码,这个账号就是mysql的用户;
为什么要管理?
一个公司不可能只有一个工程师,大公司,不不仅有很多工程师 还有很多不同部门,但是数据库服务器只有一个,大家都要访问,这就涉及到用户和权限问题了
一个工程师对应一个账户,
哪些工程师可以操作哪些数据库,哪些表,甚至哪些字段,都可以进行控制,例如,腾讯,有qq和微信不同项目,qq的工程师,就不应该去访问微信项目的数据;
mysql是如何管理的
mysql本质上是一款cs软件,它具备用户认证!
我们有没有做过用户认证呢? ATM! 购物车,都做过,
我们是如何实现的?写入文件,mysql也是一样的,
只不过它把文件称为表
那么要怎么添加账户呢?
把用户信息写入表中就可以了
权限相关表
来看看它都把数据放在哪个表中了!
自带的mysql数据库,四个表用于存储账户信息以及权限
user
db
table_priv
columns_priv
权限优先级
user->db->table_priv->columns_priv
select *from user;
#由于字段较多 以表格形式展示 会比较乱,可以添加\G来纵向显示
select *from user\G;
内置root账户字段信息解析
创建账号语句
create user 用户名@"ip地址" "identified" by 密码;
create user tom@"192.168.101" identified by "123";
该语句表面tom只能在101机器上使用,别的机器就无法登录
用%可以表示在任意机器可用
注意:该方式创建的账号没有任何权限 所以了解即可
授权语句
授权:
授权语句执行时如果账号不存在会自动创建账号 所以更推荐使用
注意:默认只有root才能为其他账号授权
grant all on *.* to tom@"localhost" identified by "123";
#该语句中的all 增删改查所有权限 但是不包括grant权限
#*.* 表示任何数据库 任何表 存储在user表
grant all on *.* to toms@"%" identified by "123";
# host 为% 表示 该账户可以在任何主机上登录但是不包括localhost
grant all on *.* to toms@"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";
#收回权限
drop user@"host"
#删除用户
flush privileges;
#刷新权限表 一些时候权限信息可能会有所延迟 可以执行该语句立即刷新权限信息
pymysql模块
pymysql是python提供的一个mysql客户端模块,用于与mysql服务器建立连接,发送查询,并获取结果等;
基本使用:
import pymysql
# 1.建立连接
try:
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="",db="day46",)
print("连接服务器成功!")
#2.获取游标对象
cursor = conn.cursor()
#3.执行sql语句
count = cursor.execute("select *from user")
print("结果数量: %s" % count)
# 提取结果
# print(cursor.fetchall())
# print(cursor.fetchone())
# print(cursor.fetchmany(1))
# 移动游标位置 相对当前位置
cursor.scroll(1,"relative")
cursor.scroll(-1, "relative")
print(cursor.fetchone())
# 移动游标位置 使用绝对位置
cursor.scroll(0, "absolute")
print(cursor.fetchone())
print(cursor.fetchall())
# 注意 游标移动到末尾后无法在读取到数据 若需重复读取数据,需要使用scroll来移动游标
except Exception as e:
print("连接服务器失败.....")
print(type(e),e)
finally:
if cursor:
cursor.close()
print("关闭游标")
if conn:
conn.close()
print("关闭链接")
上述代码中 fetch 相关函数返回值类型为元组,使用起来不够方便,我们可以在创建游标时指定游标类型为字典类型像这样:
cursor = conn.cursor(pymysql.cursors.DictCursor)
sql注入攻击
何为sql注入
sql注入指的是,用户在输入数据时,按照sql的语法,来编写带有攻击目的的sql语句,并插入到原始语句中执行.
例如:登录功能,需要用户输入用户名和密码
正常的一个登录功能代码如下:
try:
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="",db="day46",)
print("连接服务器成功!")
cursor = conn.cursor(pymysql.cursors.DictCursor)
user = input("username:")
password = input("password:")
count = cursor.execute("select *from user where name = '%s' and password = '%s'" % (user,password))
if count:
print("登录成功!")
else:
print("登录失败!")
except Exception as e:
print(type(e),e)
finally:
if cursor:cursor.close()
if conn: conn.close()
上述代码有被注入攻击的危险
尝试在用户名中输入以下内容,密码随意
jerry' — ass
或者连用户名都不用写
' or 1 = 1 -- asaa
解决方案:
1.客户端在发送sql给服务器前进行re判断
这样的问题在于一些程序可以模拟客户端直接发送请求给服务器
2.在服务器端将sql交给mysql是作进一步处理,相关的代码其实pymysql已经做了封装
我们只要保证不要自己来拼接sql语句即可,将拼接参数操作交给pymysql.
try:
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="",db="day46",)
print("连接服务器成功!")
cursor = conn.cursor(pymysql.cursors.DictCursor)
user = input("username:")
password = input("password:")
sql = "select *from user where name = %s and password = %s"
print(sql)
count = cursor.execute(sql,(user,password)) # 参数交给模块
if count:
print("登录成功!")
else:
print("登录失败!")
except Exception as e:
print(type(e),e)
finally:
if cursor:cursor.close()
if conn: conn.close()
增删改
import pymysql
# 1.建立连接
try:
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="",db="day46",)
print("连接服务器成功!")
cursor = conn.cursor(pymysql.cursors.DictCursor)
#增
#sql = "insert into user values(null,%s,%s,%s)"
#count = cursor.execute(sql,("tom","man","123321"))
# 一次性插入多条记录
#sql = "insert into user values (null,%s,%s,%s)"
#count = cursor.executemany(sql, [("周芷若","woman","123"), ("赵敏","woman","321")])
#删
# count = cursor.execute("delete from user where id = 1")
#改
count = cursor.execute("update user set name = '刘大炮' where id = 1")
if count:
print("执行成功!")
else:
print("执行失败!")
# 获取最新的id
# print(cursor.lastrowid)
except Exception as e:
print(type(e),e)
finally:
if cursor:cursor.close()
if conn: conn.close()
强调:pymysql 对于数据的增删改默认都不会生效,必须调用链接对象的commit()来提交修改 或者在创建链接对象时指定为自动提交;
conn.commit()
#或者创建链接对象时指定为自动提交
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="",db="day46",autocommit=True)
数据库-用户管理与pymysql的更多相关文章
- Oracle 数据库用户管理
Oracle 数据库用户管理 Oracle 权限设置 一.权限分类: 系统权限:系统规定用户使用数据库的权限.(系统权限是对用户而言). 实体权限:某种权限用户对其它用户的表或视图的存取权限 ...
- 05 数据库入门学习-正则表达式、用户管理、pymysql模块
一.正则表达式 正则表达式用于模糊查询,模糊查询已经讲过了 like 仅支持 % 和 _ 远没有正则表达式灵活当然绝大多数情况下 like足够使用 #语法 select *from table whe ...
- MySQL数据库(五)--用户管理、pymysql模块
一.用户管理(权限管理) 在MySQL中自带的mysql数据库中有4个表用于用户管理的 # 优先级从高到低 user > db > tables_priv > columns_pri ...
- mysql数据库: 用户管理、pymysql使用、navicat插件使用
一.用户管理 二.pymysql增删改查 三.sql注入攻击 一.用户管理 数据安全非常重要 不可能随便分配root账户 应该按照不同开发岗位分配不同的账户和权限 mysql中 将于用户相关的数据放在 ...
- MySQL数据库(五)—— 用户管理、pymysql模块
用户权限管理.pymysql模块 一.用户管理(权限管理) 在MySQL中自带的mysql数据库中有4个表用于用户管理的 # 优先级从高到低 user > db > tables_priv ...
- Python 42 mysql用户管理 、pymysql模块
一:mysql用户管理 什么是mysql用户管理 mysql是一个tcp服务器,应用于操作服务器上的文件数据,接收用户端发送的指令,接收指令时需要考虑到安全问题, ATM购物车中的用户认证和mysql ...
- 4. Oracle数据库用户管理备份与恢复
一. Oracle用户管理备份介绍 Oracle物理备份核心就是将物理文件拷贝一份副本:存放在磁盘上.物理文件指的是:数据文件,控制文件,日志文件,参数文件等等. 根据数据库状态而分:备份可分为热备份 ...
- 【HICP Gauss】数据库 数据库管理(文件 用户管理 系统权限 对象权限 profile)-7
数据库运行 依赖不同类型的文件 ,数据文件 参数文件 控制文件 redo日志文件 运行日志文件 审计日志文件等 数据文件 就是表空间文件 存储数据库的数据文件 参数文件 用户修改的配置信息 控制文件 ...
- sybase用户管理(创建、授权、删除)
一.登录用户管理:1.创建用户:sp_addlogin loginame, passwd [, defdb] [, deflanguage] [, fullname] [, passwdexp] [, ...
随机推荐
- 2019年全国高校计算机能力挑战赛初赛C++语言解答
1; 题目一 16.电商促销某种商品时,希望通过打折鼓励消费者组团消费.已知,团队消费金额=该团的人数和*商品单价.打折规则如下:当组团消费者数量不满50人时,商品消费金额没有折扣:消费者数量大于等于 ...
- Quartz.NET总结(三)如配置jobs
前两篇文章,已经介绍了Quartz.NET的使用和Cron表达式表达式的写法,今天说一说Quartz的配置,Quartz相关的配置有三个quartz.config.quartz_jobs.xml.lo ...
- 在Asp.Net Core中配置使用MarkDown富文本编辑器实现图片上传和截图上传(开源代码.net core3.0)
我们的富文本编辑器不能没有图片上传尤其是截图上传,下面我来教大家怎么实现MarkDown富文本编辑器截图上传和图片上传. 1.配置编辑器到html页 <div id="test-edi ...
- Vue中调用另一个组件中自定义事件
之前在一个场景中,遇到组件需要调用父组件中的方法tableInit(),字组件调用父组件常用的有三种方法,具体参考:https://www.cnblogs.com/jin-zhe/p/9523782. ...
- vue-cli 3.0按需引入element-ui
vue-cli 3.0脚手架初始化项目成功后,如果需要按需引入element-ui,按照官网的教程,会报如下错误: 这个是由于babel编译插件版本问题,需要安装最新的babel编译插件“@babel ...
- css知识笔记:垂直居中(别只看,请实操!!!)
css实现元素的垂直居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目的, ...
- swift多线程定时器
swift多线程定时器的使用 func countDown(_ timeOut:Int,view: UIView){ var timeout = timeOut let queue:DispatchQ ...
- 转战物联网·基础篇05-通俗理解MQTT协议的实现原理和异步方式
网络上搜索MQTT协议,会出现太多的解释,这里就不做官方标准释义的复制了.这一节我们从实战理解角度,通俗的将MQTT协议的作用及实现原理说一下,旨在可以快速理解MQTT协议.所以可能会出现很多看似 ...
- mysql中用命令行复制表结构(数据)
mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2; 或 CREATE TABLE 新表 ...
- 以特定用户和组来执行某个程序 - linux
运行cockpit 服务时,我们指定运行此程序的用户和组:cockpit-ws cockpit-ws 我们使用 sudo -u -g 命令来进行运行: sudo -u cockpit-ws -g co ...