Python和MySQL里面的两个知识点
01、Python之json格式化输出
最近在和其他游戏工作室的同事在对接一些阿里云服务器上的接口,在运维平台调用一个阿里云的数据接口的时候,返回了一大串数据,看内容是很长的一个json串,一般如果API的返回值是几行的话,我都会直接手敲的方法简单看下json串的结构,但是这个API返回值结果实在是太长了,它包含云服务器的硬件属性、MySQL服务属性以及很多健康监控数据,实在是没办法手工处理,于是想到了利用python中的json模块来处理,话不多说,直接给出这部分的代码,(这里使用了data的一个测试串,测试串内容随便写的,代码可以左滑):
这个测试串的运行结果如下:
这里首先解释下:json.dumps和json.loads是json格式处理函数(可以这么理解,json是字符串)
(1)json.dumps函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps函数是将字典转化为字符串)
(2)json.loads函数是将json格式数据转换为字典(可以这么理解,json.loads函数是将字符串转化为字典)
这里解释下上面的json.dumps里面的参数,第一个参数不说了,就是串本身,第二个参数ensure_ascii是因为json.dumps序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False,如果我们不适用上面的ensure_ascii=False,这时候的输出结果如下:
我们可以看到,里面的内容是u开头的ascii字符,而不是汉字,如果我们想西显示汉字,必须使用ensure_ascii=False这个属性。
第二个参数sort_keys代表将数据根据keys的值进行排序,第三个参数indent代表缩进的字符数。
02、localhost和127.0.0.1的区别
今天处理工单的时候,发现了这个小问题,这里记录下,在连接线上的数据库的时候,发现mysql不能登录,具体的登陆命令和报错结果记录了一下:
上面分别是连接失败和连接成功的时候的结果,图中的代码可以左滑,我们可以发现,这两个登录的连接串只有最后的-h后面的参数不同,一个是127.0.0.1,另外一个是localhost,localhost可以登录成功,127.0.0.1不能登录成功,之前登录线上其他数据库的时候,某些情况下127.0.0.1也可以登录成功,也没有深究过这个问题,今天研究了这两种登录方式的区别,总结如下:
第一.概念区别
localhost也叫local ,正确解释为:本地服务器
127.0.0.1在系统的正确解释是:本机地址(本机服务器)
第二.连接方式区别
localhot(local)是不经网卡传输。这点很重要,它不受网络防火墙和网卡相关的的限制。访问localhost也不会解析成ip,不会占用网卡、网络资源。而127.0.0.1是需要通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制。
换句话说:当时用mysql -h 127.0.0.1 的时候,使用TCP/IP连接;而当我们使用mysql -h localhost 的时候,是不使用TCP/IP连接的,而使用Unix socket;
第三.mysql不能进行自动域名和ip转换
如果我们在mysql中连接数据库,要是定义了localhost的用户权限,连接的时候就要用localhost而不能用127.0.0.1。因为mysql中对于用户的登陆位置是有限定的,具体见mysql数据库(database名字就是mysql)里面的user表,里面存放的ip和存放的域名是不一样的,mysql进行匹配时不会自动将ip转换成域名的。你授权一个用户从这个ip访问,不等于授权它从这个域名访问。
mysql.user表中的部分用户如下:
我们可以看出,一些用户是可以使用localhost登陆的,另外一些只能通过127.0.0.1来登陆。当我们使用127.0.0.1去代替localhost登陆时,就会出现我上面出现的错误。
除了localhost和127.0.0.1之外,有时候我们会听到本地IP这个概念,关于这个概念,可能有几个意思,我的理解如下:本机来讲,一般有三块网卡,一块网卡叫做 loopback(这是一块虚拟网卡),另外一块网卡叫做 ethernet (这是有线网卡),另外一块网卡叫做 wlan(这是无线网卡)。本机 IP 就是真实网卡的 IP,具体来说有线无线各有一个,而 127.0.0.1 是那块叫做 loopback 的虚拟网卡的 IP。
所以,以后为了确保登陆服务的时候能够避开防火墙和网络的干扰,我们可以尽量时用localhost来代替127.0.0.1这个地址,在开通数据库服务的用户时,也可以尽量开通成localhost类型。