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 可以試試!!!