FastAPI 快速開發 Web API 項目: 通過 SQLAlchemy 進行數據操作
介紹
FastAPI 不要求我們強制使用 SQL(關系)數據庫。因此,我們可以根據需求使用任何關系數據庫,例如:
- PostgreSQL
- MySQL
- SQLite
- 神諭
- 微軟SQL Server
- ...
這篇文章以 MySQL 為例,首先需要為 MySQL 安裝 Python 庫,FastAPI 需要使用 Python 的 MySQL 客戶端庫來連接到 MySQL 數據庫,這些驅動包括 和 。mysql-connector-pythonpymysql
安裝這些庫:
pip install mysql-connector-python pymysql安裝成功如圖所示:

用于定義 FastAPI 依賴項的 Python 文件名沒有特定的命名約定。通常,最好使用與應用程序的功能和角色匹配的名稱命名,包含定義 FastAPI 依賴項的函數的 Python 文件。
在終端中,運行以下命令以在 MySQL 數據庫中創建數據庫 :example_db
//Login to MySQL
mysql -u root -p
//Create database named example_db
CREATE DATABASE example_db;
創建數據庫表 :users
CREATE TABLE
`users` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb3往數據庫表中插入一條數據:
INSERT INTO users (name) VALUES ("Atom");db.py 文件
例如,通常命名一個包含依賴項函數的 Python 文件,該函數定義與上面示例中所示的 MySQL 數據庫的連接,以指示它具有與數據庫相關的功能,例如 或 。db.pydatabase.py
此外,如果您有多個定義 FastAPI 依賴項的函數,或者如果您為不同功能定義了依賴項,則可以通過為每個功能指定不同的名稱來提高代碼的可讀性。
例如,請考慮以下文件名:
- db.py:包含定義與 MySQL 數據庫連接的依賴項的文件。
- auth.py:定義與身份驗證相關的依賴項的文件。
- validation.py:定義驗證輸入數據的依賴項的文件。
根據項目的大小和結構,您還可以設計目錄和模塊的層次結構。通過將包含定義依賴項的函數的 Python 文件放置在適當的目錄中并將它們組織為模塊,可以改進代碼管理和可維護性。
將 MySQL 客戶端庫添加到 FastAPI 依賴項:使用 FastAPI 依賴項將 MySQL 客戶端庫添加到您的應用程序。例如,如果使用 ,請按如下方式添加依賴項:mysql-connector-python
$ touch routers/db.py然后在 中寫入如下代碼:db.py
from fastapi import Depends
import mysql.connector
def get_db_connection():
connection = mysql.connector.connect(
host='localhost',
port=3306,
user="root",
password="123456",
database="example_db"
)
return connection
def get_db():
connection = get_db_connection()
db = connection.cursor()
try:
yield db
finally:
db.close()
connection.close()db_router 文件
在路由器上使用 MySQL 數據庫:要將 MySQL 數據庫與 FastAPI 的路由器一起使用,請使用上面定義的 函數作為依賴項。下面是在 FastAPI 的路由器中使用 MySQL 數據庫的示例。get_db()
在將 MySQL 數據庫與 FastAPI 路由器一起使用的示例 Python 文件名中,通常最好根據應用程序的功能和角色對其進行命名。你可以想到這樣的文件名:
- main.py:包含示例代碼的文件,該示例是應用程序的主要入口點,定義 FastAPI 路由器并使用 MySQL 數據庫。
- router.py:定義 FastAPI 路由器并包含使用 MySQL 數據庫的示例的代碼的文件。
- db.py:包含用于連接和查詢 MySQL 數據庫的函數的文件。
根據項目的大小和結構,您還可以設計目錄和模塊的層次結構。例如,您可以通過創建名為路由器的目錄,在其中創建定義 FastAPI 路由器的模塊,并在其中包含使用 MySQL 數據庫的示例代碼來提高代碼組織和可讀性。
例如,可以考慮以下文件名和目錄結構:
- main.py:作為應用程序主入口點的文件,導入并使用路由器目錄中的路由器模塊。
- routers/db_router.py:定義使用 MySQL 數據庫的示例路由器的模塊。
- routers/db.py:定義用于連接和查詢MySQL數據庫的函數的模塊。
db_router.py文件寫入如下內容:
from fastapi import FastAPI, Depends
from mysql.connector import cursor
from db import get_db
import json
app = FastAPI()
# def get_db(db: cursor.MySQLCursor = Depends(get_db)):
# return db
@app.get("/users/")
async def get_users(db: cursor.MySQLCursor = Depends(get_db)):
query = "SELECT * FROM users"
db.execute(query)
result = db.fetchall()
if result:
return {"users": result}
else:
return {"error": "User not found"}
@app.get("/users/{user_id}")
async def get_user(user_id: int,
db: cursor.MySQLCursor = Depends(get_db)):
query = "SELECT * FROM users WHERE id = %s"
db.execute(query, (user_id,))
result = db.fetchall()
if result:
return {"user_id": result[0][0], "username": result[0][1]}
else:
return {"error": "User not found"}
@app.get("/user_name/{user_name}")
async def insert_user(user_name: str,
db: cursor.MySQLCursor = Depends(get_db)):
query = "INSERT INTO users (name) VALUES (%s)"
db.execute(query, (user_name,))
result = db.fetchone()
db.execute("COMMIT")
return {"user_name": user_name}啟動 FastAPI 服務
uvicorn db_router:app --reload
INFO: Will watch for changes in these directories: ['/Users/sharland/dev/fastapi/MySQL/routers']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [60501] using WatchFiles
INFO: Started server process [60503]
INFO: Waiting for application startup.
INFO: Application startup complete.當您在瀏覽器中訪問 http://127.0.0.1:8000/docs 時,將顯示一個屏幕,允許您使用 GUI 操作快速 API 服務。

訪問 ,可以獲取當前數據庫中的所有用戶數據:http://127.0.0.1:8000/users/
"users":[[1,"Atom","2023-04-20T13:14:00"],[2,"Nuoza","2023-04-20T13:14:20"]]}當訪問 時,結果:http://127.0.0.1:8000/users/1
{"user_id":1,"username":"Atom"}新增一個用戶,。操作如圖:http://127.0.0.1:8000/user_name/Dole

總結
本文總結了通過 MySQL 驅動連接 Python, 實現了一個 FastAPI 連接 MySQL 數據庫的示例, 并結合代碼結構設計了目錄結構和實現了獲取用戶和增加用戶的功能,但是本文只是簡單使用了原生的 MySQL,其實 FastAPI 支持結合 SQLAlchemy 更方面創建模型的數據庫語句,今后會繼續沿用這個示例寫用戶的登錄和注冊功能, 敬請期待。




























