FastAPI で postgresql データ取得【Ubuntu22】

スポンサーリンク
スポンサーリンク

はじめに

前回は React と FastAPI の交信を確認しました。

今回は Ubuntu に postgresql をインストールし、FastAPI でデータを取得していきます。

前提条件

前提条件は以下の通りです。

  • Ubuntu22.04
  • Python == 3.10.12
  • FastAPI がインストールされている

postgresql のインストール

sudo apt install postgresql postgresql-contrib
psql --version
>> psql (PostgreSQL) 14.9 (Ubuntu 14.9-0ubuntu0.22.04.1)

postgresql でDB・ユーザー作成

sudo -u postgres psql
postgres=# ALTER ROLE postgres WITH password 'password';

これでパスワード設定が完了しました。

続いて、別のユーザーを作成していきます。

sudo -u postgres bash
createuser -d -r -s user1
ALTER USER user1 with encrypted password 'pass1';
sudo nano /etc/postgresql/14/main/pg_hba.conf

pg_hba.conf を以下のように変更して保存してください。

 "local" is for Unix domain socket connections only
local   all             all                                     peer
↓
 "local" is for Unix domain socket connections only
local   all             all                                     md5

反映するために postgresql を再起動しておきます。

sudo systemctl restart postgresql.service

続いて、データベースを作成します。

sudo -u postgres psql
create database user1_db with owner user1;

先ほど作成した user1 がオーナーのデータベース user1_db を作成しました。

続いて、テーブルを作成していきます。

sudo -u postgres psql
postgres(# \c user1_db
user1_db(# \c - user1

これで user1 で user1_db にアクセスできました。

user1_db=# create table user1_list (
user1_db(# id serial primary key,
user1_db(# name text not null
user1_db(# );

テーブルの作成が完了しました。

postgresql で Insert

続いて、先ほど作成したテーブルにデータを挿入していきます。

user1_db(# insert into user1_list (name) values ('first name');
user1_db(# insert into user1_list (name) values ('second name');

id は自動付与なので省略します。

今追加したデータを確認します。

user1_db=# select * from user1_list;
 id |    name     
----+-------------
  1 | first name
  2 | second name
(2 rows)

無事に追加できています。

FastAPI でデータ取得

次は FastAPI でデータを取得していきます。

mkdir backend
cd backend
touch main.py
touch .env
sudo apt-get install libpq-dev
python3 -m pip install python-dotenv
python3 -m pip install psycopg2-binary
python3 -m pip install psycopg2
python3 -m pip install sqlalchemy

次に .env を編集します。

# postgresのユーザー
POSTGRES_USER=user1
# postgresのパスワード
POSTGRES_PASSWORD=pass1
# postgresのサーバー
POSTGRES_SERVER=127.0.0.1
# postgresのサーバーのポート
POSTGRES_PORT=5432
# postgresのデータベース名
POSTGRES_DB=user1_db

main.py は以下のようにしてください。

import os
import uvicorn
from dotenv import load_dotenv
load_dotenv()

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy import create_engine, Integer, Text, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

app = FastAPI()
Base = declarative_base()

origins = [
    "http://127.0.0.1:83",
    "http://localhost:3000",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

POSTGRES_USER = os.environ['POSTGRES_USER']
POSTGRES_PASSWORD = os.environ['POSTGRES_PASSWORD']
POSTGRES_SERVER = os.environ['POSTGRES_SERVER']
POSTGRES_PORT = os.environ['POSTGRES_PORT']
POSTGRES_DB = os.environ['POSTGRES_DB']

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)
session = SessionLocal()

class User(Base):
    __tablename__ = "user1_list"
    user_id = Column("id",
                        Integer,
                        primary_key=True,
                        autoincrement=True)
    name = Column("name",
                     Text,
                     nullable=False)


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

@app.get("/users/")
def get_all_user():
    user_list = []
    for r in session.query(User):
        user_list.append(r)
    return user_list

@app.get("/users/{id}")
def get_one_user(id):
    user_list = []
    for r in session.query(User).where(User.user_id == id):
        user_list.append(r)
    return user_list

@app.post("/add_user/")
def add_one_user():
    user = User(name="hello")
    session.add(user)
    session.commit()
    return {"result": "success"}

@app.put("/update_user/{id}")
def update_user(id):
    query = session.query(User).where(User.user_id == id).first()
    query.name = "v2name is my name"
    session.commit()
    return {"result": "success"}

@app.delete("/delete_user/{id}")
def delete_user(id):
    query = session.query(User).where(User.user_id == id).delete()
    session.commit()
    return {"result": "success"}

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000)
    session.close()

プログラムの説明は次回行います。

上記を実行します。

python3 main.py

無事にデータを確認できました!

おわりに

今回は FastAPI で Postgresql のデータを取得しました。

プログラムの細かい部分は説明できていませんので次回説明します。

コメント

タイトルとURLをコピーしました