Database&APIの作成

本日はSQLite3を利用して、データベースの環境設定と作成成功しました。
![Screenshot 2023-12-15 at 21.50.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/67c8f264-f55d-703b-c38c-d04ae0172bc5.png)
今のところはデータがまだまだ書いていませんので、これから頑張ります。

データベースを作った後、APIの作成です。
一応、下で書いたコードは完成品です。
```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/43d0d8c8-454a-ff48-62c4-053321fc61a1.png)

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

ここで、開けたAPIのlocal serverを確認する。
下のRequestを使います。
```
http://127.0.0.1:8000/words
```
![Screenshot 2023-12-15 at 21.58.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/09d896f8-82b7-c54c-ceb0-0260b3e24c41.png)


最後には全部が確認できた後で、Gdevelopに確認します。
![Screenshot 2023-12-15 at 22.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/a096c549-a45f-4962-7209-78a30f54df95.png)

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

![Screenshot 2023-12-15 at 22.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/ef3aa8d7-72c9-d75f-4012-9c04c48fbc98.png)
![Screenshot 2023-12-15 at 22.02.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/6a95744c-4615-9d4f-dd65-48ad6bbbdcaa.png)
![Screenshot 2023-12-15 at 22.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/88f82bee-8340-92bd-c081-72e53f0e1774.png)

問題ですが、ボタンを2回を押さないと表示できない。
写真の通りに、一回押す時、"0"が出る
![Screenshot 2023-12-15 at 22.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/bc79bc4d-dc4c-88d4-05b9-8dc5023b420f.png)

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

今日は成功です！

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