Djangoプロジェクトのローカル上にデータベースを構築する

この記事はDjangoを用いてwebアプリを作成する際にプロジェクトのローカル上にデータベースを構築する方法について説明するものである．

## 前提条件
Djandoプロジェクトが作成されていて，`python manage.py runserver`によって以下の画面が表示されていることを前提とする．
![スクリーンショット 2024-04-16 23.39.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/6dde9003-9eb4-8224-3ccc-b80c54090f95.png)
できていない場合は以下いずれかの記事を参照すること．
DockerでDjango環境構築
https://qiita.com/tarakokko3233/items/39e91cd39a12d1507b06
仮想環境でDjando環境構築
https://qiita.com/tarakokko3233/items/46c567fb32a26a69269a

今回はrunserverをした後にプロジェクトのルートディレクトリに生成される`db.sqlite3`を用いてデータベースを構築する．このファイルの中に生成したテーブルやデータが格納される．`db.sqlite3`を直接開くことはできないのでデータベース管理用のソフトウェアで開く必要がある．


## 1.データベースの構築設定(モデル，ビュー，エンドポイント)
今回は例としてusersテーブルにname属性とemail属性を設定する．
```models.py
from django.db import models

class Users(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

    def __str__(self):
        return self.name

```
models.pyを変更したらデータベースに適用させるために以下のいずれかのコマンドを実行する．

**Dockerを用いて環境構築した場合**
```
$ docker-compose run web python manage.py makemigrations
$ docker-compose run web python manage.py migrate
```
**仮想環境上で環境構築した場合**
仮想環境をアクティベートする
Mac用
```
$ source venv/bin/activate
```
Windows用
```
$ venv\Scripts\activate
```
仮想環境をアクティベートした状態で以下のコマンドを実行する．
```
$ python manage.py makemigrations
$ python manage.py migrate
```
次にビューとエンドポイントを設定する．
使用するusersモデルと表示するhtmlを指定する．
```views.py
from django.shortcuts import render
from django.views import generic
from yourappname.models import Users

class UserListView(generic.ListView):
    model = Users
    template_name = 'user_list.html'
    context_object_name = 'users'

```
ビューにアクセスするためのエンドポイントを指定する．
```urls.py
from django.contrib import admin
from django.urls import path
from yourappname.views import UserListView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', UserListView.as_view(), name='user'), #ルートにアクセスしたらuser_list.htmlにアクセスする
]

```
## 2.テーブルのデータ表示用のテンプレートを表示
yourappnameディレクトリにtemplatesディレクトリを作成する．
templatesディレクトリを認識するために以下の設定をsetting.pyに記述する．
```setting.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], #ここを変更する
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
```
templatesディレクトリにuser_list.htmlを作成する．
ここでは簡単にデータを表示するテンプレートを作成する．
```user_list.html
<!DOCTYPE html>
<html>
<head>
    <title>User List</title>
</head>
<body>
    <h1>User List</h1>
    <ul>
        {% for user in users %}
            <li>{{ user.name }} - {{ user.email }}</li>
        {% endfor %}
    </ul>
</body>
</html>

```


## 3．GUIソフトでテーブルにデータを追加，編集，削除
任意のデータベースGUIソフトウェアをインストールする．今回はTablePlusを使用する．
https://tableplus.com

ソフトウェアを開いたら上部に＋ボタンがあるので押したら以下の画面になる．
![スクリーンショット 2024-04-19 12.26.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/75c2a78d-ba70-3e41-e141-8a1443e5b7bb.png)
SQLiteを選択し，`Database Path`に`db.sqlite3`のパスを入力し，Connectを選択する．
>`Name`はなんでもいい

![スクリーンショット 2024-04-19 16.18.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/fe6b0c91-5db7-570b-ca8a-6530945771d6.png)


するとusersテーブルが作成されていることがわかるので選択すると設定したid,name,email属性がテーブル内にあることがわかる．(Djangoは主キーとして勝手にid属性が設定される)
>テーブル名はmodels.pyで作成した名前である．．

![スクリーンショット 2024-04-19 16.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/ebd2c6dd-9d8d-ba40-6b31-faa56855f060.png)


テーブル内でダブルクリックをしてテーブルにデータを追加する．**追加した際にctrl+S(macはcmd+S)で保存する**
>保存は忘れないこと！！！

![スクリーンショット 2024-04-19 16.20.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/a7b60fcf-a7f0-bb46-043d-c1b21f2a0f5e.png)


>データを編集，削除する際はデータを右クリック(macは左クリックまたはctl+右クリック)して編集，削除することができる．**編集，削除時も保存は忘れないこと！！！**

## 4．実行
**Dockerで環境構築した場合**
```
$ docker-compose up
```
でコンテナを立ち上げるかDockerDesktopで対象のコンテナの実行ボタンを押す．
実行した後
http://0.0.0.0:8000
にアクセスしたら以下の画面が表示されていると完成である．



**仮想環境で構築した場合**
仮想環境をアクティベートしていることを確認して，以下のコマンドを実行する．
```
$ python manage.py runserver
```
実行した後
http://127.0.0.1:8000
にアクセスしたら以下の画面が表示されていると完成である．

![スクリーンショット 2024-04-19 16.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/e8433fde-22c6-15e9-4c45-521c251e59fc.png)