如何在Ubuntu上與關係型數據庫一起使用Fast API

引言

FastAPI 迅速受到歡迎,成為一個高性能、易於使用的 Python 建立的 API 網頁框架。當與關係型數據庫搭配時,FastAPI 可以用來創建強大、可擴展的应用程序。本指南將带你通過在 Ubuntu 24.04 機器上設定帶有關係型數據庫的 FastAPI 應用程序的過程。我們將涵蓋從安裝必要的工具到配置數據庫和創建 API 端點的一切。

使用 PostgreSQL 數據庫與 FastAPI

先決條件

在跟進本教程的步驟之前,您需要:

  • 一台運行Ubuntu的伺服器,以及一個具有sudo權限的非root用戶和一個活躍的防火牆。要了解如何設定此環境,請從此清單中選擇您的的分發版,並遵循我們的初始伺服器設定指南。請確保使用受支持的Ubuntu版本

  • 熟悉 Linux 命令行。若要了解更多或重温命令行的基礎,您可以閱讀此篇Linux 命令行简介指南。

  • 在 Ubuntu 終端機中運行 sudo apt-get update,確保您的系統已經有最新的版本和安全性更新,這些软件是由您系統上配置的存放庫所提供。

這些指示對於最新版本的 Ubuntu 是有效的:Ubuntu 24.04、Ubuntu 22.04 和 Ubuntu 20.04。如果你正在使用 Ubuntu 版本 <= 18.04,我們建議你升級到更新的版本,因為 Ubuntu 不再為這些版本提供支援。這份指南將幫助你升級 Ubuntu 版本。

步驟 1 – Python 環境設定

Ubuntu 24.04 默認搭載 Python 3。開啟終端並運行以下命令以確定 Python 3 是否已安裝:

python3 --version

如果 Python 3 已經在你的電腦上安裝,這個命令將返回 Python 3 的當前版本。如果尚未安裝,你可以運行以下命令以安裝 Python 3:

sudo apt install python3

接下來,你需要在你的系統上安裝 pipdev 套件安裝器。在終端中運行以下命令:

sudo apt install python3-pip python3-dev

在本教程中,我們將使用 PostgreSQL 作為我們的關係型數據庫。要與 PostgreSQL 數據庫進行互動,您需要使用以下命令安装 libpq-dev

sudo apt install libpq-dev

步驟 2 – 創建和啟用虛擬環境

如果您正在使用 Ubuntu 版本 < 24.04,則不需要創建虛擬環境。您可以跳到 下一步

下一步是者在您的 Ubuntu 安裝中創建一個虛擬環境,以將 Python 包與您的系統環境隔離。为此,請转到您的工作目录並運行以下命令集:

python3 -m venv fastapi-env

此命令将在 named fastapi-env 的目錄中創建一個新的虛擬環境。它將具有自己的专用 Python 包,与其他項目隔離。

為了確保從此刻起您安裝的包 Inside this isolated environment, you need to activate it by running:

source fastapi-env/bin/activate

运行后,您會發現終端提示符前缀有您的虛擬環境名稱,如下所示:

Output
(fastapi-env) ubuntu@user:

步驟3 – 安裝和設定PostgreSQL

下一步是安裝PostgreSQL(或您選擇的關聯式資料庫)。

sudo apt install postgresql postgresql-contrib

現在,是时候在您的虛擬環境中開始並啟用PostgreSQL服務。

sudo systemctl start postgresql
sudo systemctl enable postgresql

您可以通過運行sudo systemctl status postgresql來檢查PostgreSQL服務的狀態。一旦服務被啟用,它會在系統啟動時自動開始。

要與FastAPI一起安裝和使用PostgreSQL,您需要安裝一些東西:

  1. asyncpg:這是個異步PostgreSQL驅動程式,讓FastAPI能夠與PostgreSQL數據庫進行互動。
  2. SQLAlchemy:這是一個ORM工具,幫助您管理數據庫結構和查詢作為Python代碼,而不是撰寫原始SQL。
  3. databases:這是個用於異步操作的數據庫庫,是SQLAlchemy與FastAPI異步工作的必要條件。

要安裝這些,請運行以下合併命令:

pip install asyncpg sqlalchemy databases

接下來,創建一個具有必需權限的Postgres數據庫和用戶。

sudo -u postgres psql
CREATE DATABASE <user_db>;
CREATE ROLE <username> WITH PASSWORD '<password>';
GRANT ALL PRIVILEGES ON DATABASE <user_db> TO <username>;
exit

步驟4 – 創建示例Python應用程序

你需要一個可以通過FastAPI訪問你數據庫的可執行Python應用程序。如果你還沒有運行的Python應用程序,你可以通過以下步驟快速創建一個:

在你的項目目錄中創建一個命名為postgres_db.py的新Python文件。

nano postgres_db.py

在文字編輯器中,你將寫下創建數據庫連接并在數據庫內創建表的邏輯。在這個示例中,我們使用databases包創建一個PostgreSQL數據庫連接,並使用SQLAlchemy定義books表的結構。

from databases import Database
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, Float

DB_URL = "postgresql://username:password@localhost/user_db"

database = Database(DB_URL)
metadata = MetaData()

books = Table (
  "books",
  metadata,
  Column("id", Integer, primary_key=True, index=True),
  Column("title", String, index=True),
  Column("author", String, index=True),
  Column("price", Float),
)

engine = create_engine(DB_URL)
metadata.create_all(engine)

保存並關閉文件。

接下來,在同一目錄中創建一個main.py

nano main.py

在這個文件中寫下你的應用程序主要邏輯:

from fastapi import FastAPI
from typing import List
from pydantic import BaseModel
from postgres_db import books, database

app = FastAPI()

class BookCreate(BaseModel):
    title: str
    author: str
    price: float

class BookResponse(BaseModel):
    id: int
    title: str
    author: str
    price: float

class Config:
  orm_mode=True

@app.on_event("startup")
async def startup():
    await database.connect()

@app.on_event("shutdown")
async def shutdown():
    await database.disconnect()

@app.post("/books/", response_model=BookResponse)
async def create_book(book: BookCreate):
    query = books.insert().values(title=book.title, author=book.author, price=book.price)
    last_book_id = await database.execute(query)

    query = books.select().where(books.c.id == last_book_id)
    inserted_book = await database.fetch_one(query)
    return inserted_book

@app.get("/books/", response_model=List[BookResponse])
async def get_books():
    query = books.select()
    return await database.fetch_all(query)

這段代碼使用FastAPI將新的書籍条目寫入PostgreSQL數據庫,並從其中获取書本集合。

步驟5 – 安装必需的庫

在你的Python應用程序中,你正在引用各種庫和包。在運行應用程序之前,請確保已經安裝了必需的庫。

pip install fastapi uvicorn psycopg2

步驟6 – 運行Python應用程序

現在,是時候執行您創建的應用了。

uvicorn main:app --reload

uvicorn 是一個異步伺服器網關接口(ASGI),用於提供 FastAPI 應用服務。由於 FastAPI 本身是一個異步網絡框架,使用 uvicorn 是運行 FastAPI 應用的首選方式。

如果上述命令執行時未遇到錯誤,您將會看到類似如下的輸出:

Output
INFO: Will watch for changes in these directories: ['/path/to/your/project'] INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [XXXX] using StatReload INFO: Started server process [YYYY] INFO: Waiting for application startup. INFO: Application startup complete.

在網頁瀏覽器中,導航至 http://127.0.0.1:8000 來查看查詢輸出結果。

步驟 7 [可選] – 測試端點

您可以通過向運行在 http://127.0.0.1:8000 的伺服器發送 HTTP 請求來測試您在 main.py 中定義的端點(即 POSTGET)。

{
  "title": "The Great Gatsby",
  "author": "F. Scott Fitzgerald",
  "price": 10.99
}

同樣,您可以對同一伺服器發出 GET 請求,以檢索您 Postgres 數據庫中現有的書籍列表。

結論

在這個教程中,您將通過設定一個簡單的FastAPI應用程序,該應用程序與PostgreSQL數據庫進行互動。這些步驟對AI應用程序也很有益,特別是當您需要建立一個Web API來與您的AI模型互動或管理與您的AI流程相關的数据時。有了這個基礎,您現在可以建立和擴展您的FastAPI項目。

請密切关注我們對如何使用FastAPI的更多文章。

Source:
https://www.digitalocean.com/community/tutorials/use-fastapi-with-relationaldb-ubuntu