初心者向け：HerokuにDjangoをデプロイする際のPostgresの設定

#この記事について
HerokuにDjangoをデプロイする際にPostgresを本番環境へ、SQLiteをローカル環境で自動につながるように設定する方法についてまとめます。

#前提条件
既にDjangoがHerokuでデプロイされているが、DB設定を行ってない状態であるのが前提です。DjangoをHerokuにデプロイしていない場合、[こちら](https://github.com/heroku/heroku-django-template)を参考にデプロイしてください。Djangoはフォルダ構成にじゃっかん癖がある(`Project`フォルダと`App`フォルダが別にある等)ので、馴染みのない方は既にHerokuに動くことを想定してフォルダ構成、設定ファイルが予め作られているものを`git clone`した方が早いです。

#STEPS
大きく分けて、以下のステップを踏みます。
1. PostgresをHerokuにインストール
2. setting.pyの変更
3. superuserの作成

###1. PostgresをHerokuにインストール
実はDjangoをHerokuにデプロイした時点で、PostgresqlのインスタンスがHeroku上に自動で作成されています。インスタンスが作成されているかは、Herokuにログインしてadds-onにPostgresがあるか確認するほか、Heroku CLIで以下のコマンドを叩くことで確認できます。

```bash
$　heroku addons -a {Heroku Project Name}
```

以下、自分のラップトップで実行した際のスクリーンショットです。
![heroku_addson.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464595/da524353-4b02-b710-575d-dc0eb1022cc1.jpeg)

もし、Posgresが無い場合、以下のコマンドを実行することでインスタンスを作成できます。

```bash
$　heroku addons:create heroku-postgresql:hobby-dev
```

###2. setting.pyの変更
[Django2.0でHerokuデプロイ手順](https://qiita.com/RyuSA/items/04f8f6a22370ca639ff9)を参考に、`setting.py`のDATABASE情報を以下のように書き換えます。

```python

# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

from socket import gethostname
hostname = gethostname()

if "COMPUTER-NAME" in hostname:
    # デバッグ環境
    # DEBUG = True 
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    ALLOWED_HOSTS = ['*'] 
else:
    # 本番環境
    # DEBUG = False
    import dj_database_url
    db_from_env = dj_database_url.config()
    DATABASES = {
        'default': dj_database_url.config()
    }
    ALLOWED_HOSTS = ['*']
```

`hostname = gethostname()`では自分が操作しているコンピュータの名称が取得されています。コンピュータの名称は[こちら](https://support.office.com/en-us/article/do-you-need-help-locating-your-computer-name-00384381-8aa9-4398-b81b-475f09fed618)で確認してください。確認後、`"COMPUTER-NAME"`の部分を自分のコンピューターの名称に書き換えましょう。
これによりローカルからアクセスした場合のみ`if "COMPUTER-NAME" in hostname:`がTrueになるので、ディフォルトで設定してあったSQLiteの接続情報がその配下に書かれています。また`else:`では本番DB、つまりPostgresの接続情報が必要です。`dj_database_url.config()`では、環境変数の一つであるDATABASE_URLを元に接続情報のディクショナリーが入ります。HerokuではディフォルトでDATABASE_URLにPostgresのパスが設定されているため、これ以上の設定は必要ありません。

###3. superuserの作成
[公式サイトの手順](https://docs.djangoproject.com/en/1.8/intro/tutorial02/)に従い、以下のコマンドを叩いてスーパーユーザを作成します。

```
$python manage.py createsuperuser
```

すると、`Username`、`Email Address`、`Password`の登録をするように聞かれます。ここで設定する値はDjangoの用意するAdminページにログインする際に必要なので覚えておいてください。

次に、コマンドでローカルでこのDjango Appを立ち上げ、Adminページにアクセスできるかを確認します。

```
$python manage.py runserver
```

次に、ブラウザを開き`http://127.0.0.1:8000/admin`へアクセスし、登録!したIDとパスワードを入力します。
![admin_screenshot2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464595/d5b293d0-b50b-d897-46ba-792a3e966e60.jpeg)

これでログインができたら成功です。
ちなみに、スーパーユーザーの登録を行うと`user_auth`テーブルにレコードを挿入しにいきます。DB設定を行っていないと登録できないので、これでDBにつながっているのがわかります。

ローカルでDBに繋がっているのがわかったので、次に本番環境（Herokuサーバー）でも同じことを行います。Heroku CLIを使うことで以下のコマンドで`createsuperuser`実行することができます。

```
$heroku run python manage.py createsuperuser
```

他にも、`heroku run bash`を実行することでリモートサーバに直接アクセスできるので、そこで`python manage.py createsuperuser`を実行することもできます。

スーパーユーザ作成後、Adminサイトにローカルと同じように入ることができれば成功です。

#最後に
３つお願いです！
・つまづいたりしたら気軽にメッセージください。サポートします。
・Djangoに詳しい方からのご意見、アドバイスお待ちしてます。
・ためになったと思ったら「いいね」押して頂けると幸いです。


#参考
[Add Postgresql Database to Django on Heroku](https://www.youtube.com/watch?v=sGfqBd-J_jg)
[Heroku Posgresql 公式](https://devcenter.heroku.com/articles/heroku-postgresql)
[Deploying Django to Heroku: Connecting Heroku Postgres](https://medium.com/@BennettGarner/deploying-django-to-heroku-connecting-heroku-postgres-fcc960d290d1)
[HerokuにDjangoアプリをデプロイする方法](https://qiita.com/OcchiNecchi/items/8e5e9ed1980556e453b0)
[Pypi dj-database-url 公式](https://pypi.org/project/dj-database-url/)