Ubuntu上でFast APIと关系型データベースを使用した実装方法

はじめに

FastAPIは、PythonでAPIを構築するための高性能で簡単に使用できるウェブフレームワークとして、素早く人気を博しました。関連付けられた関係型データベースとともに、FastAPIは強力でスケーラブルなアプリケーションを作成することができます。このガイドで、Ubuntu 24.04マシン上で関連付けられた関係型データベースとともにFastAPIアプリケーションを設定する手順を説明します。必要なツールのインストールからデータベースの設定、APIエンドポイントの作成までをカバーします。

FastAPIとPostgreSQLデータベースの使用

前提条件

このチュートリアルに従う前に、以下が必要です。

  • Ubuntuを実行しているサーバーと、sudo権限を持つ非rootユーザー。設定方法についてのガイドラインは、このリストからお選びくださいし、最初のサーバー設定ガイドを参照してください。Ubuntuのサポートされているバージョンで作業することを確認してください。

  • Linuxのコマンドラインに慣れていること。コマンドラインの入門または再び学ぶために、このガイドを参照してください:《Linux command line primer》。

  • 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

次に、pipおよびdevパッケージインストーラーをシステムにインストールします。ターミナルで以下のコマンドを実行してください。

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

PostgreSQLサービスの状態を確認するには、sudo systemctl status postgresqlを実行します。サービスを有効化すると、自動的にシステムの起動時に開始されます。

FastAPIと一緒にPostgreSQLをインストールして使用するには、いくつかのものをインストールする必要があります。

  1. asyncpg:これはアスynchronous 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アプリケーションの作成

运行中のPythonアプリケーションが必要でない場合、以下の手順に従って素早く新しいアプリケーションを作成できます。

プロジェクトディレクトリ内に新しいPythonファイルpostgres_db.pyを作成します。

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は、Asynchronous Server Gateway Interface (ASGI)で、FastAPIアプリケーションをサービスするために使用されます。uvicornを使用することは、FastAPIは自己の非同期Webフレームワークであるから、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.

Webブラウザでhttp://127.0.0.1:8000にアクセスして、クエリの出力を確認します。

手順7 [オプション] – エンドポイントをテストする

あなたのmain.pyで宣言したPOSTGETのエンドポイントをテストするには、http://127.0.0.1:8000で実行されているサーバーにHTTP要求を送信することができます。

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

同様に、同じサーバーにGETコールを行い、Postgresデータベースにある本の一覧を取得することができます。

結論

このチュートリアルでは、PostgreSQLデータベースとやりとりするシンプルなFastAPIアプリケーションの設定手順を説明しました。これらの手順は、AIアプリケーションにも有益です。特に、AIモデルとやりとりするWeb APIを構築したり、AIプロセスに関連するデータを管理する必要がある場合です。この基础を奠定した後、FastAPIプロジェクトを構築および拡張することができます。

FastAPIと共に働く方法についての更なる記事にご期待ください。

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