接續
day22
的內容,今日會陸續加入 前端網頁(js) <-> python(tornado) <-> mongoDB 黑修斯的調試方法,昨日深思,因為這些debug的過程,或說程式"調試密技",個人覺得非常值得一學,畢竟由黑修斯消化、整理放上來的文章,對於讀者來說,並無太大程式功力的幫助,簡單來說,看了黑修斯寫的文章,可以成功建立,可是如果沒有人給於指導,不就無法思考了?!
好像廢話有些多了,重點就是,希望大家可以深入理解程式設計。
day22
實作兩個功能(查詢與新增)。
接續
day22
的內容,並加入前端至後端的測試。
開始前,不免要說一下,每天關心的時事,最近很紅的python,線上課程(付費的、免費的)開枝散葉的大肆攻略版面,不管是深度學習、機器學習等,我認為這個時代阿,實作才是最重要的,你做了多少作品,比起你知道多少更重要,想要知道上網查一下就有了。重點是能不能解決問題吧
程式碼放在 github
day22
實作兩個功能,這兩個功能還有兩個地方沒有完善,第一個是對前端的溝通還沒有完成,第二個是python程式的封裝,接下來我們就朝這兩個方向出發。
這招學起來,日後無往不利。
程式碼放在 github -> day23/day23_ex1
下面程式碼,延續day22_ex2修改而成
,我新增了 myfind 變數,並將其印出,要讓各位了解myfind 變數的物件。
#查詢資料的型態
myquery = {} #要搜尋的資料 空白全部搜尋,填值搜尋特定值。
noquery = {"_id": 0} #要排除的資料
myfind = mycol.find(myquery)
print(type(myfind))
你可以看到,印出的物件類別為: <class 'pymongo.cursor.Cursor'>
使用原生python idle 開啟檔案,並輸入myfind,可以得到相同結果,如下圖:
思考時間:為什麼透過for 迴圈 可以印出內容,而使用變數去收,就會出現 <class 'pymongo.cursor.Cursor'>物件呢?
這邊設一變數xx 指定等於 list(myfind),並印出 xx,就可以完整資料解析了:
現在變數xx是list 型別,就可以使用list 方法調用,如下:
剩下的就是資料處理的事情了,該丟甚麼資料給前端,等等會實作
day22
的實作的功能類別的介紹與基礎實作,請參考這篇 張凱喬寫的 關於Python的類別(Class)...基本篇,黑修斯這邊不贅述。
這邊介紹,Atom快速建立class的方便性,直接輸入class 使用代碼補全,就可以快速建立:
我有寫個簡單測試python程式碼放在 github -> day23/day23_class_test
樣式快速建立後,直接輸入類別名稱,即可,會同時改三個地方,請見下圖:
程式碼放在 github -> day23/day23_ex2
我已經先封裝好,兩個功能在class myclass中,最終輸出結果如下圖:
下面程式碼是class myclass的內容:
class myclass():
"""docstring for myclass."""
def __init__(self,mydb_Name,collection):
#連接本地端mongoDB
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
#設mydb繼承myclient[mydb_Name]的屬性。
self.mydb = myclient[mydb_Name]
#你的collection名稱
self.mycol = self.mydb[collection]
def show_state(self):
print("目前存在的DB有 ",myclient.list_database_names())
print("目前存在的collection有 ",self.mydb.list_collection_names())
def insert_data(self,data): #新增功能
#實作:新增功能
self.mydata = data
self.mycol.insert_one(self.mydata) #單筆插入資料指令
print("資料單筆新增成功")
def get_data(self, myquery = {}, noquery={"_id": 0}): #獲得資料
self.myquery = myquery #要搜尋的資料 空白全部搜尋,填值搜尋特定值。
self.noquery = noquery #要排除的資料
self.myfind = self.mycol.find(myquery)
self.xx = list(self.myfind)
return self.xx
透過下圖紅框中所示,我們主要調用就是用呼叫的方式:
就請各位讀者熟習,意思為要多多練習,這個時代不缺知道的人,只缺捲起袖子實作的人。
程式碼放在 github -> day23/day23_test.py
可以參考我day14的文章,有說明如何建立。
另外我在github上,有放檔案day23_test.py,讓同學可以直接練習單功能實作:
一開始先來review一下,
day21
提到大約需要四個步驟,如下:
第一步:會員查詢
查詢會員檔中會員是否存在,查詢user_id是否存在,存在才可以進行後續動作,不存在是否進行註冊?
第二步:會員新增
若會員存在 -> 進入第三步,不存在就新增,這邊實現會員新增的功能。
第三步:會員更新
異動檔資料的上傳完成,再將主檔更新儲存。
第四步:會員刪除
直接刪除會員資料。
下圖,是我們目前的進度,現在我們要實作第三步,會遇到幾個問題?
先前我們提過,資料的無價性,前面我們是直接對主檔資料做更動,若是資料有遺失,那就不好了,因此我們實務上的設計,要考慮資料的安全性...等,重點資料先不要遺失,資料不能被竊取,但這邊不討論資料被竊取,先討論資料的穩定。
我們在類別的設計上,可以指定要儲存的資料集(collection),因此對於資料結構的配合,我們留到後面再討論,這邊先實作功能。
程式碼放在 github -> day23/day23_ex3
下列為myclass 類別中新增的程式碼
def delete_data(self, mydelete): #實作:會員刪除
self.mydelete = mydelete
self.mycol.delete_one(self.mydelete)
def updata(self, myquery, new_values): #實作:會員更新
self.myquery = myquery
self.new_values = new_values
self.mycol.update_one(self.myquery, self.new_values)
在主要設置區的程式碼
# 定義一個新的myclass物件為b
b = myclass(mydb_Name="day21", collection="main")
#刪除功能
mydelete = { "user_id": "A7654321" }
b.delete_data(mydelete)
#更新功能
updata_value = { "name": "黑修斯" }
new_data = { "$set": { "name": "嘿嘿嘿" } }
b.updata(updata_value, new_data)
import pprint
pprint.pprint(b.get_data())
但這些程式碼還不夠完成!!
小作業:為什麼不完整呢,前面的資料結構有說明,我們必須修改一些程式碼,讓功能新增引數,讓我們可以選擇collection(主檔、異動檔、會員檔)
明天完善myclass,並開始由前端出發 <-> 後台python(tornado)。