Flask連線資料庫打怪升級之旅

weixin_34129145發表於2017-09-04
7209287-ca72392d6b4480c9.jpg

前言

在初學 Flask 的時候,在資料庫連線這部分也跟每個初學者一樣。但是隨著工作中專案接手的多了,程式碼寫的多了,歷練的多了也就有了自己的經驗和技巧。在對這塊兒程式碼不斷的進行升級改造後,整理了自己在連線資料庫這部分的的一個學習經驗,也就是我們今天分享的連線資料庫部分的打怪升級之旅。希望可以為大家在學習 Python 的路上提供一些參考。

初級階段

首先安裝 Mysql 擴充套件包

yum install python-dev
pip install MySQL-python

建立資料庫連結

import MySQLdb as mysql

db=mysql.connect(user='root',passwd='123456',db='reboot',charset='utf8')
cur=db.cursor()

開啟打怪升級之路

在日常開發中,連線資料庫最多的應用場景就是,查詢所有資料和查詢單條資料。就以查詢所有資料場景為例。

小白版本——在後端憑接表格,傳到前端渲染

cur.execute('select * from host') 
str = ""

# 結果以元組巢狀的形式返回 ((id,name), (id,iname),……)
result= cur.fetchall():

# 迴圈父元祖,然後按照索引依次獲取到每列的值,
for c in result: 
    str = '<tr><td>%s</td> \
    <td>%s</td> \
    <td>%s</td> \
    <td>%s</td> \
    <td><span class="update-btn" data-id="%s">update</span></td> \
    <td><span class="delete-btn" data-id="%s">delete</span></td> \
    </tr>' % (c[0],c[1],c[2],c[3],c[0],c[0])
    str += str

cur.close()
return jsondumps(str)

進階階段

第一關——後端消滅 HTML 標籤

後端:

# 執行sql
cur.execute('select * from user') 
result = cur.fetchall(): 
return render_template("index.html",result=result)

前端:

<table border="1px">
<tr>
    <td>ID</td>
    <td>user</td>
    <td>passwd</td>
    <td>sex</td>
    <td>phone</td>
    <td>操作</td>
</tr>
{% for user in result %}
<tr>
    <td>{{user[0]}}</td>
    <td>{{user[1]}}</td>
    <td>{{user[2]}}</td>
    <td>{{user[3]}}</td>
    <td>{{user[5]}}</td>
</tr>
{% endfor %}
</table>

第二關——讓返回值更優雅

users = []
# 指定需要返回的列,存入列表
fields = ['id', 'username', 'name', 'email', 'mobile'] 

# join將列表轉為字串,傳入sql
sql = "SELECT %s FROM user" % ','.join(fields) 
cur.execute(sql)

# 迴圈返回的元組
for row in cur.fetchall(): 
   user = {}
   # 利用enumerate遍歷列表,i為索引號,k為元素
   # fields中列作為user字典的k,索引作為mysql返回列表的k,給字典賦值
   for i, k in enumerate(fields): 
        user[k] = row[i] 
        users.append(user)
        
# 返回結果時列表巢狀字典,前端渲染就更優雅了
# eg:[{'name':'wd','age':18},{'name':'pc','age':19},……]
return json.dumps({'code': 0, 'users': users})

第三關——讓程式碼更簡潔

fields = ['id','username','name','email','mobile']

result= cur.fetchall()
users= [dict((k, row[i]) for i,k in enumerate(fields)) for row in result]

return json.dumps({'code':0,'users':users})

一個更高效的方式——直接將返回的巢狀元祖轉換為巢狀的字典,常用與只查詢 ID, Username 的場景

result = cur.fetchall() 
# 最終結果 {1: 'ab', 2: 'bc'}
result = dict([(x['0'], x['1']) for x in result])

經驗總結

作為一個程式設計師學習新的技術知識都是必須的,我們都是自己事業上無人可替的開拓者,我們都是要經歷從入門到熟練再到精略的過程,過程雖然很痛苦不過收穫的喜悅也是別人羨慕不來的,IT 大牛 不是那麼容易就練成的。希望今天的分享能夠幫助到大家。致每一位程式設計師

相關文章