如何在Ubuntu上使用Fast API与关系型数据库

介绍

FastAPI迅速流行起来,作为一个高性能、易用的Web框架,用于使用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 当前的版本。如果尚未安装,您可以运行以下命令进行安装:

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

此命令将在名为fastapi-env的目录中创建一个新的虚拟环境。它将具有自己的专用Python包,与其他项目隔离。

为了确保从现在开始安装的包都安装在这个隔离的环境中,您需要通过运行以下命令来激活它:

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工具,它可以帮助您管理数据库模式和查询,而不是编写原始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应用程序

您需要一个可执行的Python应用程序,通过FastAPI访问您的数据库。如果您没有运行中的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 本身是一个异步的 Web 框架,使用 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