[Python] 使用map函數把數據庫表頭跟字段內容生成字典形式


重點:

cursor這里有個屬性:description。獲取的是數據庫每個欄位(字段,列)情況: (('id', 3, None, 11, 11, 0, False), ('type', 253, None, 5, 5, 0, False)

# 將一條數據轉成字典方便查找
new = dict(zip([x[0] for x in cursor.description],[x for x in cursor.fetchone()]))
# 將多條數據轉成字典方便查找,map函數可以把列表中所有元素一個個地傳遞給一個函數,實現多條循環取
def new2dict(new):
  return dict(zip([x[0] for x in cursor.description],[x for x in new]))
news_list = list(map(new2dict,cursor.fetchall()))
 
連接數據庫
  import pymysql
  # 連接數據庫
  db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8')
  以上的參數是必填的
  · host: 這個是ip地址,因為我這里是本地的,所以填127.0.0.1,也可以填localhost。
  · user:用戶名,如果你也是本地的,就填root好了
  · passwd:這個是密碼,填上你自己設的密碼就可以了
  · db:這個是數據庫名,我這里選的是news數據庫
  · port:這個是端口,本地的一般都是3306
  · charset:這個是編碼方式,要和你數據庫的編碼方式一致,要不會連接失敗
 連接上了,怎么驗證呢?這里我們可以選擇查一條數據
try:
    db = pymysql.connect(host='127.0.0.1',user='root',passwd='your         password',db='news',port=3306,charset='utf8')
    # 檢驗數據庫是否連接成功
    cursor = db.cursor()
    # 這個是執行sql語句,返回的是影響的條數
    data = cursor.execute('SELECT * FROM `new`')
    # 得到一條數據
    one = cursor.fetchone()
    print(data)
    print(one)
except pymysql.Error as e:
    print(e)
    print('操作數據庫失敗')
finally:
    # 如果連接成功就要關閉數據庫
    if db:
    db.close()
代碼解讀:因為在連接數據庫中,有時會發生連接失敗等異常,所以這里就進行捕捉異常,這里的異常都是在 pymsql.Error 里面。上面的代碼看不懂也沒關系,因為我接下來會說,如果運行后有結果證明連接成功。
  在用完后,一定要記得關閉數據庫連接,防止資源泄露問題。
對數據進行查詢
import pymysql
try:
    conn = pymysql.connect(host='127.0.0.1',user='root',passwd='password',db='news',charset='utf8',port=3306)
    # 這個是光標,用來操作數據庫語句
    cursor = conn.cursor()
    # 執行sql語句
    cursor.execute('SELECT * FROM `new`')
    print(cursor.fetchone())
    # 關閉光標
    cursor.close()
except pymysql.Error as e:
    print(e)
    print('操作數據庫失敗')
finally:
    if conn:
    conn.close()
代碼解讀:
  · cursor():這個是光標,用來執行mysql語句的,用完后也是需要關閉的
  · excute():這個是執行語句,執行參數的mysql語句
  · fetchone():這個是查看執行語句后的一條數據
  · fetchall():這個是查看所有數據
在查詢數據后,返回的是一整條數據,有沒有可以按字典形式來查詢的呢?來試試!
print(cursor.fetchone()['name'])

Traceback (most recent call last):
File "E:/anaconda/python_project/mysql_test/test2.py", line 8, in <module>

print(cursor.fetchone()['name'])

TypeError: tuple indices must be integers or slices, not str
查了之后,編譯器想都不想就給了我這個錯誤,說這是個元組,不能這樣操作。
  雖然python沒有提供,但是我們可以手動轉成字典來查詢啊
cursor這里有個屬性:description。獲取的是數據庫每個欄位(字段,列)情況,如下:
print(cursor.description)

# 下面是結果
(('id', 3, None, 11, 11, 0, False), ('type', 253, None, 5, 5, 0, False), ('title', 253, None, 50, 50, 0, False), ('content', 253, None, 2000, 2000, 0, False), ('view_count', 3, None, 11, 11, 0, False), ('release_time', 12, None, 19, 19, 0, False), ('author', 253, None, 20, 20, 0, True), ('from', 253, None, 20, 20, 0, True), ('is_valibale', 3, None, 11, 11, 0, False)

所以,我們利用這個屬性手動生成字典:

# 將一條數據轉成字典方便查找
new = dict(zip([x[0] for x in cursor.description],[x for x in cursor.fetchone()]))
print(new)

# 下面是結果
{'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂賽季報銷 濃眉詹皇發聲祝福', 'content': '他遭遇左腳跟腱撕裂,將缺席賽季剩下的比賽。這無疑對考辛斯和鵜鶘隊都是一個重大的打擊', 'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author': 'xiaoylin', 'from': '騰訊體育', 'is_valibale': 1}

這里利用zip函數和列表生成式來一行代碼就生成成功了
用字典來查詢,現在就可以了

print(new['title'])
# 下面是結果
考辛斯跟腱撕裂賽季報銷 濃眉詹皇發聲祝福

但是,上面的只是一條數據的,如果是多條的呢?再按上面的方法就行不通了。這時就需要用到map函數了

def new2dict(new):
  return dict(zip([x[0] for x in cursor.description],[x for x in new]))
news_list = list(map(new2dict,cursor.fetchall()))
print(news_list)

# 下面是結果
[{'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂賽季報銷 濃眉詹皇發聲祝福', 'content': '他遭遇左腳跟腱撕裂,將缺席賽季剩下的比賽。這無疑對考辛斯和鵜鶘隊都是一個重大的打擊', 'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author': 'xiaoylin', 'from': '騰訊體育', 'is_valibale': 1}, 
{'id': 3, 'type': 'NBA', 'title': '火箭挖21分大哈登得背鍋 連遭濃眉大帽太尷尬', 'content': '火箭在客場以113-115惜敗於鵜鶘,4連勝終結。詹姆斯-哈登出戰34分鍾16投5中,其中三分球9投只有1中,罰球14罰12中,拿到23分、11助攻、5籃板但也有4次失誤,其在場正負值為尷尬的-12分', 'view_count': 7520, 'release_time': datetime.datetime(2018, 1, 27, 12, 5), 'author': 'youngcao', 'from': '騰訊體育','is_valibale': 1}]

這里很巧妙的利用了map函數,因為多條數據就可以進行迭代了,需要操作每條數據,這樣就可以想到map函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM