FastAPI: HTTPie で使う

FastAPI の sqlite3 を使うサーバーを HTTPie で使う方法です。
サーバープログラムはこちらです。
[Review all the files](https://fastapi.tiangolo.com/ja/tutorial/sql-databases/#review-all-the-files)

次の6つのファイルを作成します。

```text
sql_app/__init__.py
sql_app/database.py
sql_app/models.py
sql_app/schemas.py
sql_app/crud.py
sql_app/main.py
```

## ツリー構造

```text
$ tree sql_app
sql_app
├── __init__.py
├── crud.py
├── database.py
├── main.py
├── models.py
└── schemas.py
```

## サーバーの起動

```bash
uvicorn sql_app.main:app --reload
```

サーバーを起動すると
sql_app.db
というファイルが作成されます。

```text
├── sql_app
│   ├── __init__.py
│   ├── __pycache__
│   ├── crud.py
│   ├── database.py
│   ├── main.py
│   ├── models.py
│   └── schemas.py
└── sql_app.db
```

```text
$ file sql_app.db 
sql_app.db: SQLite 3.x database, last written using SQLite version 3035005
```

この時点でデータを見てみます。

```text
$ http http://127.0.0.1:8000/users/
HTTP/1.1 200 OK
content-length: 2
content-type: application/json
date: Sat, 19 Mar 2022 03:37:46 GMT
server: uvicorn

[]
```

## ユーザーを登録します。

```bash:go_create.sh
http POST http://127.0.0.1:8000/users/ email=aaa@example.com password=hello
http POST http://127.0.0.1:8000/users/ email=bbb@example.com password=hello
http POST http://127.0.0.1:8000/users/ email=ccc@example.com password=hello
```

この時点でデータを見てみます。

```text
$ http http://127.0.0.1:8000/users/
HTTP/1.1 200 OK
content-length: 190
content-type: application/json
date: Sat, 19 Mar 2022 03:39:24 GMT
server: uvicorn

[
    {
        "email": "aaa@example.com",
        "id": 1,
        "is_active": true,
        "items": []
    },
    {
        "email": "bbb@example.com",
        "id": 2,
        "is_active": true,
        "items": []
    },
    {
        "email": "ccc@example.com",
        "id": 3,
        "is_active": true,
        "items": []
    }
]
```

## Item を入れてみます。

```bash:create_item.sh
http POST http://127.0.0.1:8000/users/1/items/ title=weather description='Fine'
http POST http://127.0.0.1:8000/users/2/items/ title=weather description='Rain'
http POST http://127.0.0.1:8000/users/3/items/ title=weather description='Snow'
```

この時点でデータを見てみます。

```text
$ http http://127.0.0.1:8000/users/
HTTP/1.1 200 OK
content-length: 370
content-type: application/json
date: Sat, 19 Mar 2022 03:41:24 GMT
server: uvicorn

[
    {
        "email": "aaa@example.com",
        "id": 1,
        "is_active": true,
        "items": [
            {
                "description": "Fine",
                "id": 1,
                "owner_id": 1,
                "title": "weather"
            }
        ]
    },
    {
        "email": "bbb@example.com",
        "id": 2,
        "is_active": true,
        "items": [
            {
                "description": "Rain",
                "id": 2,
                "owner_id": 2,
                "title": "weather"
            }
        ]
    },
    {
        "email": "ccc@example.com",
        "id": 3,
        "is_active": true,
        "items": [
            {
                "description": "Snow",
                "id": 3,
                "owner_id": 3,
                "title": "weather"
            }
        ]
    }
]
```

この時点の sql_app.db の状態

```text
$ sqlite3 sql_app.db 
SQLite version 3.35.5 2021-04-19 18:32:05
Enter ".help" for usage hints.
sqlite> .table
items  users
sqlite> select * from users;
1|aaa@example.com|hellonotreallyhashed|1
2|bbb@example.com|hellonotreallyhashed|1
3|ccc@example.com|hellonotreallyhashed|1
sqlite> select * from items;
1|weather|Fine|1
2|weather|Rain|2
3|weather|Snow|3
sqlite> .quit
```

## 確認したバージョン

```text
$ python
Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import fastapi
>>> fastapi.__version__
'0.91.0'
```