Python和MySQL裡面的兩個知識點!你get到了沒?

01

Python之json格式化輸出

最近在和其他遊戲工作室的同事在對接一些阿里雲服務器上的接口,在運維平臺調用一個阿里雲的數據接口的時候,返回了一大串數據,看內容是很長的一個json串,一般如果API的返回值是幾行的話,我都會直接手敲的方法簡單看下json串的結構,但是這個API返回值結果實在是太長了,它包含雲服務器的硬件屬性、MySQL服務屬性以及很多健康監控數據,實在是沒辦法手工處理,於是想到了利用python中的json模塊來處理,話不多說,直接給出這部分的代碼,(這裡使用了data的一個測試串,測試串內容隨便寫的,代碼可以左滑):

Python和MySQL裡面的兩個知識點!你get到了沒?

1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3import json
4data = {'name':'yeyz','job':'DBA','label':['tall','rich','handsome']}
5print json.dumps(data, ensure_ascii=False, sort_keys=True, indent=4)

這個測試串的運行結果如下:

1{
2 "job": "DBA",
3 "label": [
4 "tall",
5 "rich",
6 "handsome"
7 ],
8 "name": "yeyz"
9}

這裡首先解釋下:json.dumps()和json.loads()是json格式處理函數(可以這麼理解,json是字符串)

(1)json.dumps()函數是將一個Python數據類型列表進行json格式的編碼(可以這麼理解,json.dumps()函數是將字典轉化為字符串)

(2)json.loads()函數是將json格式數據轉換為字典(可以這麼理解,json.loads()函數是將字符串轉化為字典)

私信菜鳥007有神秘驚喜大禮包哦!

這裡解釋下上面的json.dumps裡面的參數,第一個參數不說了,就是串本身,第二個參數ensure_ascii是因為json.dumps序列化時對中文默認使用的ascii編碼.想輸出真正的中文需要指定ensure_ascii=False,如果我們不適用上面的ensure_ascii=False,這時候的輸出結果如下:

 1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3import json
4data = {'name':'yeyz','job':'DBA','label':['高','富','帥']}
5print json.dumps(data, sort_keys=True, indent=4)
6
7
8{
9 "job": "DBA",
10 "label": [
11 "\\u9ad8",
12 "\\u5bcc",
13 "\\u5e05"
14 ],
15 "name": "yeyz"
16}

我們可以看到,裡面的內容是u開頭的ascii字符,而不是漢字,如果我們想西顯示漢字,必須使用ensure_ascii=False這個屬性。

 1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3import json
4data = {'name':'yeyz','job':'DBA','label':['高','富','帥']}
5print json.dumps(data, ensure_ascii=False, sort_keys=True, indent=4)
6
7
8{
9 "job": "DBA",
10 "label": [
11 "高",
12 "富",
13 "帥"
14 ],
15 "name": "yeyz"
16}

第二個參數sort_keys代表將數據根據keys的值進行排序,第三個參數indent代表縮進的字符數。

02

localhost和127.0.0.1的區別

今天處理工單的時候,發現了這個小問題,這裡記錄下,在連接線上的數據庫的時候,發現mysql不能登錄,具體的登陸命令和報錯結果記錄了一下:

 1[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
2Enter password:
3ERROR 1045 (28000): Access denied for user 'yeyz'@'127.0.0.1' (using password: YES)
4[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
5Enter password:
6Welcome to the MySQL monitor. Commands end with ; or \g.
7Your MySQL connection id is 599175
8Server version: 5.5.19-log MySQL Community Server (GPL)
9
10Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
11
12Oracle is a registered trademark of Oracle Corporation and/or its
13affiliates. Other names may be trademarks of their respective
14owners.
15
16Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
17
18mysql--yeyz@localhost:(none) 10:10:34>>;
19mysql--yeyz@localhost:(none) 10:10:34>>;
20mysql--yeyz@localhost:(none) 10:10:34>>;
21mysql--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表中的部分用戶如下:

 [email protected]:(none) 20:57:40>>select user,host from mysql.user;
2+------------------+-----------------+
3| user | host |
4+------------------+-----------------+
5| dba_admin | 127.0.0.1 |
6| srv_dbmonitor_ro | 127.0.0.1 |
7| tmp_test_user | 127.0.0.1 |
8| tmp_test_user02 | 127.0.0.1 |
9| dba_yeyz | localhost |
10| root | localhost |
11| tkadmin | localhost |
12+------------------+-----------------+

我們可以看出,一些用戶是可以使用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類型。


分享到:


相關文章: