2017-06-17

mLab - DBaaS 雲端 MongoDB 與 Python 快速試作範例

mLab - MongoDB 雲端資料庫,相當簡單好用。此範例從註冊 mLab、建立資料庫、新增資料、再以 Python 連接讀取資料,來試試看是否真的那麼簡單快速…


mLab 是由 MongoDB 提供的 DBaaS (Database-as-a-Service) 雲端資料庫服務,根據 DB-Engines 的調查 MongoDB 是目前第一名的 Document stores (又稱 document-oriented database systems,中譯「文件資料庫」),也是非常熱門的 NoSQL 資料庫。
本篇目的不是介紹 mLab 和 NoSQL 資料庫,而是因為據稱 mLab 非常簡單好用,又佛心來著提供 500MB 的免費雲端資料庫空間,因此試作從註冊、建立資料庫,到以 Python 連結雲端資料庫讀取資料的範例。那就開始吧…

1、mLab 註冊

1-1、到 mLab 首頁,按下中間的 "GET 500MB FREE" 或右上角的 "SING UP"都可以。

1-2、輸入註冊資料,帳號 (Account name)、第一使用者 (Username) 可以都一樣、Email、密碼、I accept 勾起來,按下 "Create account"。


2、此時 mLab 會提醒尚未完成 email 認證,到前一步輸入的信箱會收到 mLab 寄的確認 email - Verify your mLab email address,按下中間的連結完成確認。

 


3、重新登入,mLab 首頁改按右上角 "LOG IN",輸入註冊 Username、Password 登入。


4、顯示管理主頁,此時 "MongoDB Deployments" 與 "Private Environments" 都是空的。"MongoDB Deployments" 相當於關聯式資料庫的 DBMS (Database Management System) - 資料庫管理系統,按右上角的 "Create new" 建立一個新資料庫囉。



5、Create new deployment 建立新資料庫,mLab 有 hosting 在 amazon web services、Google Cloud Platform、Microsoft Azure,各家有不同的流量方案。不管它,我們只要用免費的。選 Microsoft Azure,Region 選 West US(CA),別改其它地方,提供的方案均不同。選 Single-node,點選 Sandbox 才是免費的。MongoDB Version 不用動,輸入你想取的 Database Name,確定 Price: $0 / month !按下 "Create new MongoDB deployment" 完成。

6、建立資料庫內容,這時 "MongoDB Deployments" 會多一筆剛剛新增的資料庫名 (Database Name),按一下它進入 (use) 該資料庫。



7、進入資料庫後會看見該資料庫的連線方式,mLab 提供2種連線方式 mongo shell 及MongoDB URI,這個很重要,後面以 Python 連接資料庫時會用到。先看下方的 Collections 顯示沒有資料 (None at this time)。 MongoDB 對資料庫元素有自己的命名,和關聯式資料庫 (Relational DB) 的對應如下:

MongoDB        Relational DB
Collection   =   Table (資料表)
User            =   User  (資料庫使用者)
Document   =   Row/Record  (一筆資料)
Field            =   Column (資料欄位)
_id               =    PK (主鍵值)


8、按下 "Users" 裡面也是空的 (None at this time),按下右邊的 "Add database user",為這個資料庫新增使用者,只要輸入 username、password 就可以了,若勾選 "read-only" 就只能取讀不能寫入。相較關聯式資料庫,mLab 的 user 建立很簡單。




按下 "CREATE" 後 Users 中就多一筆資料了,聰明的你必然猜到了資料庫連線方式中的 <dbuser><dbpassword> 要填的是什麼了。

9、點 Collections ,按下右邊的 "Add collection" 新增資料表,只要輸入資料表的名字 (Collection name) 就可以了,advanced options (設定 Preallocate size) 不用理它,mLab 真的超簡單~

按下 "CREATE" 後 Collections 中就多一筆資料了,但 Documents 是 0,因為還沒有資料。按下剛剛新增的 Collection 來加入資料。


10、進入資料表中,會看到沒有資料 All Documents [None at this time],按下右邊的 "Add document" 進入新增資料畫面 (Create document)。
等等…是不是少了什麼?習慣使用關聯式資料庫的朋友一定覺得很奇怪… Schema 呢?為什麼輸入資料不用先定義 Schema?
這是 NoSQL DB特殊之處,不用事先定義 Schema ,但並不代表 NoSQL 沒有 Schema ,只是不用預先定義好,而是在輸入資料的階段建立。 MongoDB 稱之為 Dynamic Schema (動態 Schema) 是很貼切的形容。 Schema 在資料輸入時動態建立,甚至擴增,這賦與 NoSQL 很大的擴充彈性 (但事情總是有好壞兩面的,待會就會看到!)



11、在新增資料畫面 (Create document) 的文字框中只要以 JSON 名/值對的格式就能新增資料了,畫面中就是一筆完整的資料,要注意所有欄位名與字串都要以雙引號包含。每對資料前面的是"名",也就是資料欄位 (Field / Column),後面的是"值",就是資料內容。按下右下角的 "Create and continue editing" 就新增一筆資料了,新增成功 mLab 會顯示該筆資料的新增結果,mLab 會自動建立 id。我目前試似乎一次只能新增一筆,那就慢慢來吧!而且 mLab 大小寫是不同的,資料欄位 (Field / Column) 名字必須都一致,不然資料是存進不去的 (可見 Schema 是存在的。)


熟悉關聯式資料庫的朋友一定想到一個問題,資料型態呢?不用事先定義 Schema 不就也代表了沒有固定的資料型態!是的,所以這張資料表可以被我們處理成這樣…


{"name":"apple","price":200}
{"name":"杏仁","price":150,"stock":"1A"}
{"name":"Apricot","price":250,"stock":20}
{"name":"Banana","price":300,"stock":30}
{"name":"orange","price":50}



我們可以在輸入第2筆資料時動態增加一個 stock (庫存) 欄位,還可以在同一個欄位輸入數值和字串不同的資料型態。在關聯式資料庫無法這麼簡單就擴增一個欄位,也無法任意輸入不同資料型態。但可以任意輸入不同資料型態,未必是件好事,弄不好可就天下大亂了。在此我們不深究這些,只是要快速建立資料庫讓 Python 使用。說到這,mLab 資料庫就都建立好囉!

接下來是 Python 出場了。

12、安裝 Python,到 Python 首頁下載安裝,選擇適合你作業系統的安裝檔,本範例為 Windows 64位元 executable installer。


13、點擊安裝檔開始安裝,記得要勾選 "Add Python 3.6 to PATH",不然就得自行加入 Python 路徑於 Path 系統環境變數,按下 "Install Now" 就會自動完成安裝。


14、安裝完成後開啟命令列視窗 (cmd),以 python 指令測試環境是否安裝正確,如果正確會看到顯示 python 的版本,並進入 python 命令環境。

python --version


python



15、安裝 PyMongo - python 的 MongoDB API 套件,按下 ctrl-z 離開 python 命令環境,輸入 python -m pip install pymongo 進行安裝,安裝完成畫面如下:

python -m pip install pymongo



16、安裝完成,開啟 python IDLE - python shell。


17、依以下順序在 python shell 中逐步輸入指令執行
17-1、import pymongo 套件,若沒有安裝 PyMongo 套件,這一步就會看到下圖的紅色錯誤訊息。

import pymongo


17-2、從 pymongo import MongoClient

from pymongo import MongoClient

17-3、透過 MongoClient 建立與 MongoDB 連線,這裡的 Your_MongoDB_URI 就是進入資料庫會看到的 standard MongoDB URI 下方那串文字,在 mLab 中複製這串文字將 <dbuser><dbpassword> 更換成你為這個資料庫建立的使用者和密碼就可以了,並須以雙引號包含。python IDLE - python shell 有自動補字功能,對於像我這種打字笨拙的人來說,這個功能太重要了。(以下 my 開頭的都是自訂變數)

myClient = MongoClient("Your_MongoDB_URI")



17-4、和我們在 mLab 中新建的 mlabtest01 資料庫,建立資料庫連線 myDB,myClient 後方是你的資料庫名。


myDB = myClient.mlabtest01
17-5、取得資料庫 (myDB) 裡的資料表 (coll01) 存入 myCollection 變數。

myCollection = myDB.coll01

17-6、由資料表 (myCollection) 中取得 (find_one()) 一筆資料並以 print 顯示,就會看到第一筆資料 apple 啦。

print(myCollection.find_one())


17-7、使用 find() 將 myCollection 中所有資料存入 myDocs ,並以 for loop 顯示。輸入 print(myDocs) 這行後要按兩次 Enter,就會顯示資料表中所有資料,可看到資料型態是不同的。

for myDocs in myCollection.find():
    print(myDocs)

17-8、計算一下資料表中的資料筆數。

myCollection.count()

python 也是 Case-sensitive 要注意大小寫,像最後一個指令中的變數 mycollection (正確為 myCollection) 大小寫不正確,可是不行的。


mLab 雲端 MongoDB 建立與 Python 連線快速試作完成,是不是真的很簡單快速呢!


😺 python 連接 MongoDB 的範例,您可以在這裡看到更完整的教學與說明 PyMongo 3.4.0 documentation