Python 連結NoSQL資料庫(Firebase)的 CRUD C:Create R:Read U:Update D:Delete * NoSQL # Part A : firebase real-time資料庫規則(測試模式) 這裡以 Firebase.google.com 的即時資料庫為例,身分認證關閉(測試模式) 先安裝 firebase module >pip install firebase (未安裝firebase模組時要先執行) ``` { /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */ "rules": { ".read": true, ".write": true } } ``` 1. post 的 python API: ``` from firebase import firebase fdb = firebase.FirebaseApplication('https://myfirstfirebase-601001.firebaseio.com') data = [ { 'Name': 'Lin', 'Age': 52 }, { 'Name': 'Vera', 'Age':21 } ] result = fdb.post('/sample1/',data) print(result) output {'name': '-NbPtTkjh_VveesN99Wn'} //新增一筆 key name='-NbPtTkjh_VveesN99Wn' ``` 2. get 的 python API: ``` from firebase import firebase url = 'https://myfirstfirebase-601001.firebaseio.com' fdb = firebase.FirebaseApplication(url) result = fdb.get('/sample1','') print(result) output: {'-NbPtTkjh_VveesN99Wn': [{'Age': 52, 'Name': 'Lin'}, {'Age': 21, 'Name': 'Vera'}]}``` ``` 3. delete 的 python API 再執行delete之前,我們再post一次 ``` {'-NbPtTkjh_VveesN99Wn': [{'Age': 52, 'Name': 'Lin'}, {'Age': 21, 'Name': 'Vera'}], '-NbPthFka5ya4kFLo0lL': [{'Age': 52, 'Name': 'Lin'}, {'Age': 21, 'Name': 'Vera'}]} ``` ``` from firebase import firebase url = 'https://myfirstfirebase-601001.firebaseio.com/' fdb = firebase.FirebaseApplication(url) fdb.delete('/sample1','-NbPtTkjh_VveesN99Wn') result = fdb.get('/sample1','') print(result) output: {'-NbPthFka5ya4kFLo0lL': [{'Age': 52, 'Name': 'Lin'}, {'Age': 21, 'Name': 'Vera'}]} //第一筆資料被刪除了!!!因此delete時要給要刪除哪個 key... ``` 4. put ``` from firebase import firebase fdb = firebase.FirebaseApplication('https://myfirstfirebase-601001.firebaseio.com') data = [ { 'Name': 'Lin', 'Age': 52 }, { 'Name': 'Vera', 'Age':21 } ] result = fdb.put('/sample1','id123456789',data) result = fdb.get('/sample1','') print(result) data1 = [ { 'Name': 'Lin', 'Age': 50 }, { 'Name': 'Vera', 'Age':20 } ] result = fdb.put('/sample1','id123456789',data1) Output: {'-NbPthFka5ya4kFLo0lL': [{'Age': 52, 'Name': 'Lin'}, {'Age': 21, 'Name': 'Vera'}], 'id123456789': [{'Age': 52, 'Name': 'Lin'}, {'Age': 21, 'Name': 'Vera'}]} {'-NbPthFka5ya4kFLo0lL': [{'Age': 52, 'Name': 'Lin'}, {'Age': 21, 'Name': 'Vera'}], 'id123456789': [{'Age': 50, 'Name': 'Lin'}, {'Age': 20, 'Name': 'Vera'}]} // put 與 post 差別之處在: post 的 key 會隨機給,而put給定 key-value,若有相同的 key時 value會覆蓋。 ``` # Part B:firebase real-time資料庫規則(認證模式) 這裡以 Firebase.google.com 的即時資料庫為例,使用身分認證模式 先安裝 firebase_admin module >pip install firebase_admin (未安裝firebase_admin模組時要先執行) 1.產生私鑰文件(apikey.json) ``` 前往Firebase控制台: 登錄到Firebase控制台:https://console.firebase.google.com/ 專案總覽 -> 專案設定 -> 服務帳戶 生成新私鑰: 在服務帳戶頁面,到“Firebase Admin SDK”部分。點擊“生成新的私鑰”,這將下載一個包含私鑰信息的JSON文件。 將私鑰文件用於連接: 在你的Python代碼中,將這個下載的JSON文件用作連接到Firebase數據庫的私鑰文件。在上述代碼示例中,將 "私鑰文件的路徑.json" 替換為你下載的JSON文件的路徑。 記得將私鑰文件保密,並不要將其分享給其他人,因為它可以用於訪問和操作你的Firebase項目 ``` ``` Get data ref = db.reference('/some_resource') print(ref.get()) Ways to Save Data set Write or replace data to a defined path, like messages/users/<username> update Update some of the keys for a defined path without replacing all of the data push Add to a list of data in the database. Every time you push a new node onto a list, your database generates a unique key, like messages/users/<unique-user-id>/<username> transaction Use transactions when working with complex data that could be corrupted by concurrent updates ``` 2.編寫一個新的py ``` import firebase_admin from firebase_admin import credentials from firebase_admin import db myDB='https://myfirstfirebase.firebaseio.com/' firetoken = credentials.Certificate("apikey.json") firebase_admin.initialize_app(firetoken, {'databaseURL': myDB}) ref = db.reference('/users') #新增一筆資料 #ref.update({'id1':'Mary'}) #查詢id的值 querry = ref.child('id3') data = querry.get() print(data) # if not.found ,return 'None' ``` 就如同測試時有 get,post,put,delete 方法對應 get,push,update,delete 後記:除了Firebase還有Amazon DynamoDB(25GB信用卡註冊),Mongodb Atlas(512M),Redis(30M)也提供免費的 NoSQL 可以試試!!!