FastAPI+PostgreSQLでデータ参照。SELECT文を実行する方法

本記事はPython初学者やFastAPIを学習したいと考えているWebエンジニア向けの入門者向けの記事になります。

この記事はFastAPIとPostgreSQLでデータを参照するAPIを作成したいと思います。

Pythonのインストールから実施しますので安心して記事を進めてみてください。

Pythonの高速APIのFastAPIを利用するシーンが多くなってきました。

案件でも使用する機会が増えてきたのでノウハウと公開したいと思います。

すこし前ですとPythonでWebアプリを作成するのはDjango一択でした。

ですが最近ではJavaScriptのフレームワーク(特にReact)+FastAPIで開発することが増えています。

JavaScriptフレームワーク+APIの構成で優れていると感じることはネイティブアプリでもコードや環境を流用することができる点です。

性能的に遅いと言われるPythonで文字通り高速なFastAPIを学習していただければと幸いです。

目次

ファイル構成とディレクトリ構成の確認

FastAPIのプロジェクトディレクトリの構成は以下になります。

fastapi/
 ├ venv/
 └ src/ 
   ├ alembic
   │  ├ env.py
   │  ├ README
   │  ├ script.py.mako
   │  └ versions/
   │    └ 1f3b2391d90c_create_users_table.py
   ├ alembic.ini
   ├ crud.py
   ├ database.py
   ├ main.py
   ├ models.py
   └ schemas.py

この記事で新規に作成するファイルは以下になります。

新規作成するファイル
  • src/crud.py

また、この記事で修正するファイルは以下になります。

修正するファイル
  • src/database.py
  • src/schemas.py
  • src/main.py

初めにsrc/crud.pyを作成します。

from sqlalchemy.orm import Session
import models
import schemas

# user_idからデータを取り出す。
def get_user(db: Session, user_id: int):
    return db.query(models.User).filter(models.User.user_id == user_id).first()

# データベース内全てのデータを取り出す。
def get_all_user(db: Session):
    return db.query(models.User).all()

crud.pyにはuser_idを取得できる関数とすべてのデータを取得できる関数を用意します。

次にsrc/database.pyを編集していきます。

import os
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

POSTGRES_USER = os.environ.get('POSTGRES_USER', 'fastapi')
POSTGRES_PASSWORD = os.environ.get('POSTGRES_PASSWORD', 'password')
POSTGRES_SERVER = os.environ.get('POSTGRES_SERVER', '127.0.0.1')
POSTGRES_PORT = os.environ.get('POSTGRES_PORT', '5432')
POSTGRES_DB = os.environ.get('POSTGRES_DB', 'fastapi')

SQLALCHEMY_DATABASE_URL = "postgresql://{0}:{1}@{2}:{3}/{4}".format(
    POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_SERVER, POSTGRES_PORT, POSTGRES_DB
)
engine = create_engine(
    SQLALCHEMY_DATABASE_URL
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

# 以下を追記
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

作成したセッションを呼び出しやすくするためのget_db関数を用意します。

次にsrc/schemas.pyを編集していきます。

from pydantic import BaseModel
from typing import List, Optional


class UserBase(BaseModel):
    name: str
    age: int
    email: str

    class Config:
        orm_mode = True


# 以下を追記
class UserPublic(UserBase):
    user_id: int
    name: str
    age: int
    email: str
    address: Optional[str]

UserPublicクラスを作成します。これはSelect時の型をチェックします。

最後にsrc/main.pyを修正していきます。

# 以下を修正
from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List

# 以下を追加
from database import engine, get_db
import models
import schemas
import crud

app = FastAPI()



@app.get("/")
async def root():
    return {"message": "Hello World"}

# 以下を追加
@app.get("/user/{user_id}", response_model=schemas.UserPublic)
def get_user(user_id: int, db: Session = Depends(get_db)):
    db_user = crud.get_user(db=db, user_id=user_id)
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user


@app.get("/user/", response_model=List[schemas.UserPublic])
def get_all_user(db: Session = Depends(get_db)):
    db_users = crud.get_all_user(db=db)
    if db_users is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_users

/userと/user/{user_id}にルーティング追加するように修正します。

参照するためのデータをデータベースに追加

postgreユーザにスイッチして、usersテーブルにデータを追加していきましょう。

su - postgres
psql -U fastapi -h 127.0.0.1 -p 5432 fastapi

以下のSQLデータを挿入するします。

INSERT INTO users (user_id, name, age, email) 
           VALUES (1, 'test001', 20, 'test001@sample.com');

INSERT INTO users (user_id, name, age, email) 
           VALUES (2, 'test002', 30, 'test002@sample.com');

INSERT INTO users (user_id, name, age, email) 
           VALUES (3, 'test003', 30, 'test003@sample.com');
commit;

データが挿入されていることを確認しましょう。

fastapi=> select * from users;
 user_id |  name   | age |       email
---------+---------+-----+--------------------
       1 | test001 |  20 | test001@sample.com
       2 | test002 |  30 | test002@sample.com
       3 | test003 |  30 | test003@sample.com

これでデータの準備は完了です。

FastAPIからSelectしてデータを取得

では実際にFastAPIからSelectしてデータを取得していきたいと思います。まずはFastAPIを起動します。

uvicorn main:app --reload --reload --workers 1 --host 0.0.0.0 --port 8000

今回はGoogle ChromeのAdvanced rest clientという拡張プラグインを使用します。

HTTPリクエストにはPostmanなどのツールでも問題ありません。

一つのデータの取得

Method、Request URLを以下の様に編集してください。

urlのhttp://IPアドレス:8000/user/1 としてみましょう。

そしてsendをクリックします。

成功すれば以下の様になります。

複数のデータの取得

urlのhttp://IPアドレス:8000/user としてみましょう。

そしてsendをクリックします。

成功すれば以下の様になります。

FastAPI+PostgreSQLでデータを参照する方法は完了しました。

次の記事でデータの追加(INSERT文)を実施します。

次の記事はこちら:FastAPI+PostgreSQLでデータ挿入。INSERT文を実行する方法

前の記事はこちらFastAPI+PostgreSQLでモデル定義+Migration

よかったらシェアしてね!
  • URLをコピーしました!
目次