Python — FastAPI,利用 google sheet 當資料庫,結合 FastAPI 的使用範例。Python framework—FastAPI , connects with google sheet.

利用 python 的網頁框架 FastAPI,結合以 google sheet 當作資料庫,寫一個增改刪查 CRUD 的範例。

Molly M
10 min readDec 15, 2021

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

會在終端機看到如下圖的樣子

terminal

接著在網址輸入 http://127.0.0.1:8000/items/5?q=somequery 會看到 JSON

{
item_id: 5,
q: "somequery"
}
JSON

document 頁面

FastAPI 連說明測試文件都產好了,在網址輸入http://127.0.0.1:8000/docs

document

(官網還有 Put 指令的範例碼,這裡僅簡介基本的使用方式,其他不多做描述。)

接著,我們來把 google sheet 當作資料庫來用

Google Sheet / gspread

使用 Python 連接到 Google 試算表之步驟。

  1. 申請 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 SAC
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("表單網址d/後面的KEY")
Sheets = Sheet.sheet1
dataTitle = ["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}"
http://127.0.0.1:8000/users/Molly

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}
POSTMAN

成功把資料丟進表單了!

google sheet

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}
fastapi
google sheet

完整的 code(55行前是本篇重點,56行之後都是補充或練習)

終於完成 ٩(ˊᗜˋ )و!

--

--

Molly M
Molly M

Written by Molly M

Molly — Software Developer / 職稱是軟體研發工程師。 什麼都寫,專精於前端及APP (ง•̀_•́)ง ! ❤ 合作發案討論疑難雜症請洽: momolly1024@gmail.com