专栏首页DBA随笔Python和MySQL里面的两个知识点

Python和MySQL里面的两个知识点

01

Python之json格式化输出

最近在和其他游戏工作室的同事在对接一些阿里云服务器上的接口,在运维平台调用一个阿里云的数据接口的时候,返回了一大串数据,看内容是很长的一个json串,一般如果API的返回值是几行的话,我都会直接手敲的方法简单看下json串的结构,但是这个API返回值结果实在是太长了,它包含云服务器的硬件属性、MySQL服务属性以及很多健康监控数据,实在是没办法手工处理,于是想到了利用python中的json模块来处理,话不多说,直接给出这部分的代码,(这里使用了data的一个测试串,测试串内容随便写的,代码可以左滑):
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
data = {'name':'yeyz','job':'DBA','label':['tall','rich','handsome']}
print json.dumps(data, ensure_ascii=False, sort_keys=True, indent=4)

这个测试串的运行结果如下:

{
    "job": "DBA", 
    "label": [
        "tall", 
        "rich", 
        "handsome"
    ], 
    "name": "yeyz"
}

这里首先解释下: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,这时候的输出结果如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
data = {'name':'yeyz','job':'DBA','label':['高','富','帅']}
print json.dumps(data,  sort_keys=True, indent=4)


{
    "job": "DBA", 
    "label": [
        "\u9ad8", 
        "\u5bcc", 
        "\u5e05"
    ], 
    "name": "yeyz"
}

我们可以看到,里面的内容是u开头的ascii字符,而不是汉字,如果我们想西显示汉字,必须使用ensure_ascii=False这个属性。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
data = {'name':'yeyz','job':'DBA','label':['高','富','帅']}
print json.dumps(data, ensure_ascii=False, sort_keys=True, indent=4)


{
    "job": "DBA", 
    "label": [
        "高", 
        "富", 
        "帅"
    ], 
    "name": "yeyz"
}

第二个参数sort_keys代表将数据根据keys的值进行排序,第三个参数indent代表缩进的字符数。

02

localhost和127.0.0.1的区别

今天处理工单的时候,发现了这个小问题,这里记录下,在连接线上的数据库的时候,发现mysql不能登录,具体的登陆命令和报错结果记录了一下:

[dba_mysql@tk-dba-mysql-stat-10-104 ~]$ /usr/local/mysql/bin/mysql -uyeyz --socket=/data/mysql_4306/tmp/mysql.sock --port=4306 -p -h127.0.0.1
Enter password: 
ERROR 1045 (28000): Access denied for user 'yeyz'@'127.0.0.1' (using password: YES)
[dba_mysql@tk-dba-mysql-stat-10-104 ~]$ /usr/local/mysql/bin/mysql -uyeyz --socket=/data/mysql_4306/tmp/mysql.sock --port=4306 -p -hlocalhost
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 599175
Server version: 5.5.19-log MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql--yeyz@localhost:(none) 10:10:34>>;
mysql--yeyz@localhost:(none) 10:10:34>>;
mysql--yeyz@localhost:(none) 10:10:34>>;
mysql--yeyz@localhost:(none) 10:10:34>>;

上面分别是连接失败和连接成功的时候的结果,图中的代码可以左滑,我们可以发现,这两个登录的连接串只有最后的-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表中的部分用户如下:

mysql--dba_admin@127.0.0.1:(none) 20:57:40>>select user,host from mysql.user;
+------------------+-----------------+
| user             | host            |
+------------------+-----------------+
| dba_admin        | 127.0.0.1       |
| srv_dbmonitor_ro | 127.0.0.1       |
| tmp_test_user    | 127.0.0.1       |
| tmp_test_user02  | 127.0.0.1       |
| dba_yeyz         | localhost       |
| root             | localhost       |
| tkadmin          | localhost       |
+------------------+-----------------+

我们可以看出,一些用户是可以使用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类型。

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447),作者:AsiaYe

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL中的json字段

    MySQL5.7.8中引入了json字段,这种类型的字段使用的频率比较低,但是在实际操作中,有些业务仍然在用,我们以此为例,介绍下json字段的操作方法:

    AsiaYe
  • MySQL之alter ignore 语法

    今天上班的时候,业务方问了我这样一个问题:我有一个表,需要添加一个唯一的字段,但是目前这个字段存在一些重复值,有没有好的解决办法。

    AsiaYe
  • SSH之hosts.allow和hosts.deny文件

    解决方法:一开始以为是防火墙开通有问题,但是发现telnet是通的,防火墙应该没有问题,重新检查防火墙内容,添加对应的规则之后,发现问题还没有解决,这个...

    AsiaYe
  • 更改Linux网卡名称

    转载自:https://blog.csdn.net/yeziand01/article/details/88424624

    zy010101
  • Linux-网卡命名方式改变了-enp0s3,enp0s8

    版权声明:可以转载,请标明作者和来源。原创首发http://kakazai.cn https://...

    zy010101
  • 『简书API:Golang 处理 json 用法讲解(4):视频版』

    谢伟
  • gbk,utf-8,unicode编码转换

    用户1733462
  • 浅谈信息收集的思路

    Christopher Hadnagy 社会工程-安全体系中的人性漏洞 社会工程 卷2:解读肢体语言 社会工程 防范钓鱼欺诈 卷3 信息安全技术管理 杰出全专家...

    周俊辉
  • 如何确保SAP OData服务的返回结构为JSON格式

    大家可能会发现默认情况下,我们调用SAP OData得到的返回结构是XML格式的,如果用JavaScript解析,不如JSON格式方便:

    Jerry Wang
  • 使用Python附加到JSON文件

    JSON的完整形式是JavaScript Object Notation。这意味着将使用编程语言的文本组成的脚本(可执行)文件用于存储和传输数据。Python通...

    用户7466307

扫码关注云+社区

领取腾讯云代金券