LoginSignup
0
0

本日はSQLite3を利用して、データベースの環境設定と作成成功しました。
Screenshot 2023-12-15 at 21.50.46.png
今のところはデータがまだまだ書いていませんので、これから頑張ります。

データベースを作った後、APIの作成です。
一応、下で書いたコードは完成品です。

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import sqlite3

app = FastAPI()

class Word(BaseModel):
    vocab: str

def db_connection():
    conn = None
    try:
        conn = sqlite3.connect("gameapi.sqlite")
    except sqlite3.Error as e:
        print(e)
    return conn

@app.get('/words/', response_model=list[dict])
def words():
    conn = db_connection()
    cursor = conn.cursor()

    cursor.execute("SELECT * FROM words")
    words = [
        {"id": row[0], "vocab": row[1], "definition": row[2], "element": row[3], "rank": row[4], "type": row[5]}
        for row in cursor.fetchall()
    ]
    
    if not words:
        raise HTTPException(status_code=404, detail="No vocabulary found")
    
    return words

@app.get("/words/meaning/{vocab}", response_model=str)
def meaning(vocab: str):
    conn = db_connection()
    cursor = conn.cursor()
    
    cursor.execute("SELECT * FROM words WHERE vocab=?", (vocab,))
    word = cursor.fetchone()

    if not word:
        raise HTTPException(status_code=404, detail=f"No vocabulary found for '{vocab}'")

    vocab_def = word[2]
    return vocab_def

@app.get("/words/element/{vocab}", response_model=str)
def element(vocab: str):
    conn = db_connection()
    cursor = conn.cursor()
    
    cursor.execute("SELECT * FROM words WHERE vocab=?", (vocab,))
    word = cursor.fetchone()

    if not word:
        raise HTTPException(status_code=404, detail=f"No vocabulary found for '{vocab}'")

    vocab_element = word[3]
    return vocab_element

@app.get("/words/rank/{vocab}", response_model=int)
def rank(vocab: str):
    conn = db_connection()
    cursor = conn.cursor()
    
    cursor.execute("SELECT * FROM words WHERE vocab=?", (vocab,))
    word = cursor.fetchone()

    if not word:
        raise HTTPException(status_code=404, detail=f"No vocabulary found for '{vocab}'")

    vocab_rank = word[4]
    return vocab_rank

@app.get("/words/type/{vocab}", response_model=str)
def word_type(vocab: str):
    conn = db_connection()
    cursor = conn.cursor()
    
    cursor.execute("SELECT * FROM words WHERE vocab=?", (vocab,))
    word = cursor.fetchone()

    if not word:
        raise HTTPException(status_code=404, detail=f"No vocabulary found for '{vocab}'")

    vocab_type = word[5]
    return vocab_type

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.2", port=7780, debug=True)


#TO RUN THE APP USE THE COMMAND BELOW
# $ uvicorn main:app --reload

このAPIはDBから文字をRequestして、その文字の意味(Definition)をResponseを貰う

最初はNgrokを使って、Public APIを作りたいです。残念ながら、ngrokの無料版は遅すぎて、[Response timed out]しか出ないので、諦めました。

その代わりに、FastAPIを使って、localhostしか出せないです。
Screenshot 2023-12-15 at 21.56.52.png

また、APIが動けるかどうかをInsomniaのWEBAPIViewerのアプリを使いました

ここで、開けたAPIのlocal serverを確認する。
下のRequestを使います。

http://127.0.0.1:8000/words

Screenshot 2023-12-15 at 21.58.37.png

最後には全部が確認できた後で、Gdevelopに確認します。
Screenshot 2023-12-15 at 22.01.01.png

簡単な説明:
ボタンを押して→意味出る

Screenshot 2023-12-15 at 22.02.15.png
Screenshot 2023-12-15 at 22.02.25.png
Screenshot 2023-12-15 at 22.02.34.png

問題ですが、ボタンを2回を押さないと表示できない。
写真の通りに、一回押す時、"0"が出る
Screenshot 2023-12-15 at 22.03.47.png

LOGでも2回書いているので、どうしてなのかよくわからないです。
しかし、一応、ゲームがAPIと繋がれました。

今日は成功です!

もし、上の問題(public API、2回ボタンを押す)が答えがあれば、教えてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0