前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python和MySQL里面的两个知识点

Python和MySQL里面的两个知识点

作者头像
AsiaYe
发布2019-11-06 15:32:09
6970
发布2019-11-06 15:32:09
举报
文章被收录于专栏:DBA随笔DBA随笔
01

Python之json格式化输出

最近在和其他游戏工作室的同事在对接一些阿里云服务器上的接口,在运维平台调用一个阿里云的数据接口的时候,返回了一大串数据,看内容是很长的一个json串,一般如果API的返回值是几行的话,我都会直接手敲的方法简单看下json串的结构,但是这个API返回值结果实在是太长了,它包含云服务器的硬件属性、MySQL服务属性以及很多健康监控数据,实在是没办法手工处理,于是想到了利用python中的json模块来处理,话不多说,直接给出这部分的代码,(这里使用了data的一个测试串,测试串内容随便写的,代码可以左滑):
代码语言:javascript
复制
#!/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)

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

代码语言:javascript
复制
{
    "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,这时候的输出结果如下:

代码语言:javascript
复制
#!/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这个属性。

代码语言:javascript
复制
#!/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不能登录,具体的登陆命令和报错结果记录了一下:

代码语言:javascript
复制
[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表中的部分用户如下:

代码语言:javascript
复制
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类型。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档