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