Python | FastAPIでAPI作成 ~その8:データベース(SQLite3)と連携

Python | FastAPIでAPI作成 ~その8:データベース(SQLite3)と連携

今回は前回の続きとして、データベースとの連携を行います。

前回の記事は以下から↓

今回は「sqlite3」を用います。

sqlite3

データベースの環境を準備します。(※事前にsqlite3はインストールしているものとします。)

インストール方法は以下の記事に纏めています。

今回は、.pyファイルのカレントディレクトリ上に「User.db」を作成します。

①コマンドプロンプトを開く

Win + R -> cmd

②カレントディレクトリに移動

cd でpyファイルが置かれているフォルダに移動

③dbの作成

以下のコマンドでdbを作成します。

sqlite3 User.db

④テーブルの作成

以下のクエリでテーブルを作成します。

create table if not exists User_list("ID" unique, "Name", "Class");

⑤レコードの追加

以下のクエリでデータをinsertします。

insert into User_list values("M001","Takashi","A");
insert into User_list values("M002","Hanako","A");
insert into User_list values("M003","Hiroshi","B");
insert into User_list values("M004","Kyoko","B");

⑥レコードの確認

select * from User_list; でレコードを確認します。

DBが作成できました。

Python Sqlite3 で接続

Pythonライブラリ「Sqlite3」を用いてSqlite3へ接続します。

pipの場合は以下↓

pip install pysqlite3 

condaの場合は以下↓

conda install sqlite3

import Sqlite3するもエラー…

ちょっと躓きました。。。

pythonのプログラム上で import sqlite3 しますが、以下の様なエラーが出て実行できませんでした。

エラー: ImportError: DLL load failed while importing _sqlite3:指定されたモジュールが見つかりません。

解決方法ですが、以下の通りです。(こちらのサイトを参考)

① 公式サイトから zipファイルをダウンロード

以下の公式サイトから dllをダウンロードします。

私の端末はWin10 x64なので、以下のzipをダウンロードします。

② zipを展開

中身はこのようになっています。

③ zipの中身を C:\anaconda3\DLLs内に保存する。

私の場合は、anaconda3フォルダはCドライブ直下に置いていますが、人によっては環境が異なるかと思いますので、適宜読み替えてください。

DLLsフォルダの中に、先ほどの「def」及び「dll」をコピーします。

以上で準備完了です。

プログラム

今回のプログラムは以下の通りです。

from fastapi import FastAPI
from pydantic import BaseModel
import sqlite3

class Item(BaseModel):
    ID: str
    Name: str
    Class: str

app = FastAPI() #インスタンスを作成

# Get /Users/ : 全件取得
# Get /Users/{ID} :特定のIDのみ取得
# POST /Users/ :ユーザの登録
# DELETE /Users/{ID} :ユーザの削除
# PUT /Users/ :ユーザの更新

def execute_query(flag,query, taple):
    conn = sqlite3.connect(r"./User.db")
    cur = conn.cursor()
    cur.execute(query, taple)
    if flag == 'S' :
        cur_tmp = cur.fetchall()
        conn.close
        return cur_tmp
    elif flag == 'E':
        conn.commit()
        conn.close
        return execute_query("S","select * from User_list;",())


#curl http://localhost:8000/Users/
@app.get("/Users/")
async def users():
    return execute_query("S","select * from User_list;",())


#curl http://localhost:8000/Users/{ID}
@app.get("/Users/{u_id}")
async def users(u_id:str):
    return execute_query("S","select * from User_list where ID =?;",(u_id,))


#curl -X POST -H "accept: application/json" -H "Content-Type: application/json" -d "{\"ID\":\"M005\", \"Name\":\"Aya\", \"Class\":\"E\"}" http://localhost:8000/Users/
@app.post("/Users/")
async def users(user: Item):
    return execute_query("E","insert into User_list values(?,?,?);",(user.ID,user.Name,user.Class))


#curl -X DELETE -H "accept: application/json" http://localhost:8000/Users/M003
@app.delete("/Users/{u_id}")
async def users(u_id:str):
    return execute_query("E","Delete from User_list Where ID =?;" , (u_id,))


#curl -X PUT -H "accept: application/json" -H "Content-Type: application/json" -d "{\"ID\":\"\", \"Name\":\"\", \"Class\":\"E\"}" http://localhost:8000/Users/M003 
@app.put("/Users/{u_id}")
async def users(u_id:str, user: Item):
    return execute_query("E","Update User_list SET Class = ? Where ID = ?;" ,(user.Class, u_id))

実行結果

最後に実行結果を確認します。

Get /Users/

curl http://localhost:8000/Users/

Get /Users/{id}

curl http://localhost:8000/Users/M002

POST /Users/{Json}

curl -X POST -H “accept: application/json” -H “Content-Type: application/json” -d “{\”ID\”:\”M115\”, \”Name\”:\”Aya\”, \”Class\”:\”E\”}” http://localhost:8000/Users/

DELETE /Users/{id}

curl -X DELETE -H “accept: application/json” http://localhost:8000/Users/M003

PUT /Users/{Json}

curl -X PUT -H “accept: application/json” -H “Content-Type: application/json” -d “{\”ID\”:\”\”, \”Name\”:\”\”, \”Class\”:\”F\”}” http://localhost:8000/Users/M002

最後にsqlite3でselect ALL

以上です!