Python — FastAPI,利用 google sheet 當資料庫,結合 FastAPI 的使用範例。Python framework—FastAPI , connects with google sheet.
利用 python 的網頁框架 FastAPI,結合以 google sheet 當作資料庫,寫一個增改刪查 CRUD 的範例。
FastAPI
FastAPI 是用於在 Python 中開發 RESTful API 的 Web 框架。FastAPI 基於 Pydantic 和類型提示,以驗證序列化和反序列化數據,並自動生成 OpenAPI 文檔。它完全支持異步編程,並且可以與 Uvicorn 和 Gunicorn 一起運行。在最初的設計中,它被認為是編輯器支持以提高對開發人員的友好性。(from wiki)
用途
API 的用途主要就是在程式與資料庫之間的資料交換,例如,前端使用 React 做畫面渲染,需要跟資料庫取得資料,中間的資料整理就會是由後端 API傳遞回來。
安裝/執行
新增一個資料夾,新增 main.py,安裝相依套件
pip install fastapi
pip install "uvicorn[standard]"
官網的 demo code
from typing import Optionalfrom fastapi import FastAPIapp = FastAPI()@app.get("/")
def read_root():
return {"Hello": "World"}@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
執行
uvicorn main:app --reload
會在終端機看到如下圖的樣子
接著在網址輸入 http://127.0.0.1:8000/items/5?q=somequery
會看到 JSON
{
item_id: 5,
q: "somequery"
}
document 頁面
FastAPI 連說明測試文件都產好了,在網址輸入http://127.0.0.1:8000/docs
(官網還有 Put 指令的範例碼,這裡僅簡介基本的使用方式,其他不多做描述。)
接著,我們來把 google sheet 當作資料庫來用
Google Sheet / gspread
使用 Python 連接到 Google 試算表之步驟。
- 申請 google sheet api >新增專案
2. 點選上方的「啟用 API 和服務」
3. 於搜尋框輸入「Google Sheets API」> 點選啟用
4. 啟用後點選畫面左方最底下的「憑證」,然後點右上方「建立憑證」
5. 選「服務帳戶」
6. 輸入帳戶的詳細資料後按建立(二跟三可以不填)
7. 完成後下面的服務帳戶會多一個電子郵件>點進去電子郵件>服務帳戶詳細資料>複製電子郵件地址
8. 點上方的標籤「金鑰」,選擇「建立新的金鑰」
9. 選擇 JSON 後按建立,存到專案的資料夾中
10. 新增一張 google sheet 表,共用人員貼上剛剛複製的電子郵件,選擇為編輯者>傳送!
python 連結 google sheet (with gspread)
安裝需要的套件
pip install gspread oauth2client
code(只有兩個地方需要調整,Json & SheetKey)
import gspread
from oauth2client.service_account import ServiceAccountCredentials as SACJson = "剛剛存進來的json金鑰檔名.json"
Url = ["https://spreadsheets.google.com/feeds"]Connect = SAC.from_json_keyfile_name(Json, Url)
GoogleSheets = gspread.authorize(Connect)Sheet = GoogleSheets.open_by_key("表單網址d/後面的KEY")
Sheets = Sheet.sheet1dataTitle = ["name", "account", "password"]
datas = ["Alex", "qaz", "111"]Sheets.append_row(dataTitle)
Sheets.append_row(datas)
print("寫入成功")
print(Sheets.get_all_values())
執行python main.py
後看到資料就表示成功啦~~
接著我們可以到 gspread 的官網看其他使用範例,像是:
取得整行/整列的資料
// 整行
values_list = worksheet.row_values(1)// 整列
values_list = worksheet.col_values(1)
以 Dictionaries 格式傳回來(這個超方便,不用自己重組 (ง•̀_•́)ง)
list_of_dicts = Sheets.get_all_records()
print(list_of_dicts)
改變表格樣式也很酷(css 語法)
Sheets.format('A1:B1', {'textFormat': {'bold': True}})
// 將A1到B1的文字改為粗體
找到指定文字
cell = Sheets.find("Molly")
print(f"在第{cell.col}排,第{cell.row}行")
更新指定欄位
Sheets.update("A6", "Ryan")
print(Sheets.get_all_records())
gspread 也可以跟 pandas 、NumPy 一起使用
(雖然這兩個巨知名套件我都還沒用過 (´•௰•`)
# pandas
dataframe = pd.DataFrame(Sheets.get_all_records())
print(dataframe)# numpy
array = np.array(Sheets.get_all_values())
print(array)
最後,綜合上述兩段,將程式整理成一個正式 api。
轉成 python FastAPI
基本的 code
import gspreadfrom oauth2client.service_account import ServiceAccountCredentials as SACfrom typing import Optionalfrom fastapi import FastAPIfrom pydantic import BaseModel# ----- Json = "你的JSON.json"Url = ["https://spreadsheets.google.com/feeds"]Connect = SAC.from_json_keyfile_name(Json, Url)GoogleSheets = gspread.authorize(Connect)Sheet = GoogleSheets.open_by_key("你的KEY")Sheets = Sheet.sheet1
GET(記得 run 起來 uvicorn main:app — reload
)
app = FastAPI()@app.get("/")
def getAllData():
return Sheets.get_all_records()
網址輸入 http://127.0.0.1:8000/ 就可以看到 google sheet 中的資料
GET 帶上參數
@app.get("/users/{userName}")
def findName(userName: str):
cell = Sheets.find(userName)
r = cell.row
x = [item for item in Sheets.row_values(r) if item]
return f"在第{cell.col}排,第{cell.row}行,{x}"
POST 比較不一樣,需要多安裝套件pydantic
且需要給定 data 值
from pydantic import BaseModelclass Info(BaseModel):
id: int
data: list@app.post("/addNewUser")
async def getInformation(info: Info):
Sheets.append_row(info.data)
return {"status": "SUCCESS", "data": info}
成功把資料丟進表單了!
PUT (現在比較少人在用)找到指定的 name,去修改他的 account
@app.put("/users/{name}/{account}")
def update_account(name: str, account: str):
cell = Sheets.find(name)
r = cell.row
Sheets.update(f"B{r}", account)
x = [item for item in Sheets.row_values(r) if item]
return {"msg": x}
完整的 code(55行前是本篇重點,56行之後都是補充或練習)
終於完成 ٩(ˊᗜˋ )و!