摘要:然后又介紹了基于的公號賬本應用的數據庫設計。歡迎關注公號四月試用。
前兩篇 微信公號DIY 系列:
微信公號DIY:一小時搭建微信聊天機器人
微信公號DIY:訓練聊天機器人&公號變身圖片上傳工具
介紹了如何使用搭建&訓練聊天機器人以及讓公號支持圖片上傳到七牛,把公號變成一個七牛圖片上傳客戶端。這一篇將繼續開發公號,讓公號變成一個更加實用的工具賬本(理財從記賬開始)。
賬本功能代碼: 項目代碼已上傳至github,地址為:gusibi/momo
賬本是一個功能比較簡單應用,公號內只需要支持:
記賬(記賬,修改金額,取消記賬)
賬單統計(提供數據和圖片形式的統計功能)
當然后臺管理功能就比較多了,這個以后再介紹。
對于數據存儲,我選擇的是MongoDB(選MongoDB的原因是,之前沒用過,想試一下),我們先看下MongoDB和關系型數據庫的不同。
MongoDB 什么是MongoDB ?MongoDB 是由C++語言編寫的,是一個開放源代碼的面向文檔的數據庫,易于開發和縮放。
mongo和傳統關系數據庫的最本質的區別在那里呢?MongoDB 是文檔模型。
關系模型和文檔模型的區別在哪里?
關系模型需要你把一個數據對象,拆分成零部件,然后存到各個相應的表里,需要的是最后把它拼起來。舉例子來說,假設我們要做一個CRM應用,那么要管理客戶的基本信息,包括客戶名字、地址、電話等。由于每個客戶可能有多個電話,那么按照第三范式,我們會把電話號碼用多帶帶的一個表來存儲,并在顯示客戶信息的時候通過關聯把需要的信息取回來。
而MongoDB的文檔模式,與這個模式大不相同。由于我們的存儲單位是一個文檔,可以支持數組和嵌套文檔,所以很多時候你直接用一個這樣的文檔就可以涵蓋這個客戶相關的所有個人信息。關系型數據庫的關聯功能不一定就是它的優勢,而是它能夠工作的必要條件。 而在MongoDB里面,利用富文檔的性質,很多時候,關聯是個偽需求,可以通過合理建模來避免做關聯。
在mongodb中基本的概念是文檔、集合、數據庫,下表是MongoDB和關系型數據庫概念對比:
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 數據庫 |
table | collection | 數據庫表/集合 |
row | document | 數據記錄行/文檔 |
column | field | 數據字段/域 |
index | index | 索引 |
table | joins | 表連接,MongoDB不支持 |
primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |
通過下圖實例,我們也可以更直觀的的了解Mongo中的一些概念:
接下來,我從使用的角度來介紹下如何使用 python 如何使用MongoDB,在這個過程中,我會實現一個簡單的MongoDB的ORM,同時也會解釋一下涉及到的概念。
簡易 Python MongoDB ORM python 使用 mongodb首先,需要確認已經安裝了 PyMongo,如果沒有安裝,使用以下命令安裝:
pip install pymongo # 或者 easy_install pymongo
詳細安裝步驟參考: PyMongo Installing / Upgrading
連接 MongoClient:>>> from pymongo import MongoClient >>> client = MongoClient()
上述命令會使用Mongo的默認host和端口號,和以下命令作用相同:
client = MongoClient("localhost", 27017) # mongo 默認端口號 為27017 # 也可以這樣寫 client = MongoClient("mongodb://localhost:27017/")選擇一個數據庫
獲取 MongoClient 后我們接下來要做的是選擇要執行的數據庫,命令如下:
>>> db = client.test_database # test_database 是選擇的數據庫名稱 # 也可以使用下述方式 >>> db = client["test-database"]
數據庫(Database)
一個mongodb中可以建立多個數據庫。
MongoDB的默認數據庫為"db",該數據庫存儲在data目錄中。
MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限,不同的數據庫也放置在不同的文件中。
"show dbs" 命令可以顯示所有數據的列表。
獲取集合執行 "db" 命令可以顯示當前數據庫對象或集合。
運行"use"命令,可以連接到一個指定的數據庫。
選擇數據庫后,接下來就是選擇一個集合(Collection),獲取一個集合和選擇一個數據庫的方式基本一致:
>>> collection = db.test_collection # test_collection 是集合名稱 # 也可以使用字典的形式 >>> collection = db["test-collection"]
集合(collection)
集合就是 MongoDB 文檔組,類似于 RDBMS (關系數據庫管理系統:Relational Database Management System)中的表。
集合存在于數據庫中,集合沒有固定的結構,這意味著你在對集合可以插入不同格式和類型的數據,但通常情況下我們插入集合的數據都會有一定的關聯性。
當第一個文檔插入時,集合就會被創建。
集合名不能是空字符串""。
集合名不能含有