Djangoのデータモデルとデータベースの関係を理解してデプロイする方法【PostgreSQL】

※ 当サイトではアフィリエイト広告を利用しています。リンクは広告リンクも含みます。

この記事は約15分で読めます。
広告

Djangoで作ったアプリをPaizaCloud(開発環境)と
Heroku(現在無料ではないのでRailway、Renderを使用)にデプロイすることで
データモデルとデータベースの関係の理解を深めることができます。
使用するデータベースはPostgreSQL。
プログラムとターミナルの作業の切り分けなど
疑問に思えるところをクリアにしていきたいと思います。
開発環境含めすべてWEB上のものを利用しているので
自分のパソコンには何もインストールしてません。
PaizaCloudなんかうまくいかなかったらサーバー削除して1から簡単に再開できます。
無料版だと使い勝手は悪いですが。

完成品は
こちらお名前.comのVPSにデプロイ
こちらRenderにデプロイ(表示するまで数分かかることがあります)になります。
学習用のものを変更せず上げてあります。
デプロイするためにsettings.pyのみ変更しています。
Windows10を使用
Heroku CLIをパソコンにインストールしないでやってます。
Herokuは2022/11/末、無料プランがなくなります。その影響なのか最近2022/10月データベースを含んだプログラムのデプロイがうまくいきません。かつてデプロイしたのもそのままやってうまくいきません。デプロイ完了しているものは動いていますが。なのでここで紹介してるherokuへのデプロイはうまくいきません。(データベースなしはうまくいく)無料で使い続けることを考えてるので原因を追究するのはやめました。他の無料のデプロイ先はこちらの記事になります。

デプロイに関して学ぶ記事として、こちらがおすすめです。

広告

参考にしたYoutube

まずこちらのYoutubeを見てください。

「本堂俊輔のITエンジニアチャンネル」さんのDjangoチュートリアルです。
今回該当する内容は#5~#7です。(Herokuへのデプロイは#3、4も参照)
#7の完成品をPaizaCloudとHerokuでPostgreSQLで動くように変更します。
#7の元のコードはSqlite3用で以下のYoutubeの概要欄にあります。
これが汎用ビューの力!最小コードでウェブサービスを作ろう | djangoチュートリアル #7

動画の内容をいろいろ駆使してやりましたがうまくいかず。
初心者の私がいろいろ調べてPostgreSQLで動くようにできた内容で
保証できるものではありませんので、そこはご了承ください。
データベースをPostgreSQLにした理由はHerokuに最初から入ってるからです。
PaizaCloud、GitHub、Herokuの基本的なところはこちらの記事を参考にしてください。

Djangoのデータモデルとデータベースの関係を理解するポイント

私がポイントだと思う点をあげると

  • データベースを接続してしまえばプログラムでデータベースを意識する必要はない。
  • データベース作成や初期データ設定などはターミナルで実行できる。
  • Djangoのデータモデルはmodeles.pyで定義されpython manage.py makemigrationsでmigrationsディレクトリに中間ファイルができ、python manage.py migrateでデータベースにその内容が反映される。なのでmodeles.pyを変更したときだけpython manage.py makemigrationsすればいい。
  • プロジェクト内に複数のアプリがある場合でも各migrationsディレクトリに0001_initial.py・・・・・ができるが特別に何かやる必要なく普通にpython manage.py migrateすればデータベースに反映される。

目次へ

PaizaCloudで動かす

ベースのコード準備

PaizaCloudを立ち上げ
新規サーバー作成→DjangoとPostgreSQLを選んで作成します。
これが汎用ビューの力!最小コードでウェブサービスを作ろう | djangoチュートリアル #7
動画の下の「もっと見る」をクリックすると
■完成版プロジェクト&テキストがあります。
そこへいき緑色のcodeをクリック、コピーマークを押して
https://github.com/*****.gitをコピー
ターミナルを開いて、以下を実行。

git clone コピーしたもの(https://github.com/*****.git)を貼り付けてEnter。
フォルダを移動
cd django-website-07 

データベース接続設定(プログラム)

プログラム部分です。
動画とはだいぶ変えています。

データベース接続部分の変更

settings.pyを以下のように変更
変更前(デフォルトのSQlite3を使うとき)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

変更後

#PaizaCloudの時(PostgreSQLを使うとき)(本番ではsettings.pyに、この辺の設定は書かないで環境変数を使う。)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'pj_db',
        'USER': 'postgres',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}
全般的な話として
settings.pyを以下のように変えて私は使ってます。
変更前
DEBUG = True

ALLOWED_HOSTS = ["*"]

変更後
DEBUG = False

ALLOWED_HOSTS = ['localhost-人によって違うところ.paiza-user-free.cloud', '人によって違うところ.herokuapp.com']

詳細は以下参照してください。

目次へ

PostgreSQLインストールとデータベース作成(ターミナルで作業)

ターミナル操作部分です。

Postgres用ライブラリのインストール
×pip install psycopg2-binary
は新しいバージョンで先に進むとエラーの原因になったので
古いバージョンを使います。
pip install psycopg2-binary==2.8.6
プロジェクト用のデータベースを作成
Postgresにログイン
sudo -u postgres psql postgres

ユーザーにパスワード設定
postgresというユーザーにパスワードを設定するという意味。

\password postgres   /が¥に変わってるいてもOK

password2回入力(password以外でもいいが変更した場合はsettings.pyの
上記で変更した
DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'pj_db',
    'USER': 'postgres',
    'PASSWORD': 'password', ←ここを変える

データベース作成
CREATE DATABASE pj_db;

Postgresからログアウト
\q

マイグレートして項目を作成
python manage.py migrate
django shell(対話的にプログラムを実行できる)の起動
python manage.py shell

カテゴリとタグとサンプル投稿を作成
django shellで以下をコピーアンドペーストして実行してサンプルデータを作成。
データベースの中身を入れておかないとエラーになるので。

from blog.models import *
cat = Category.objects.create(name="cat 1")
Category.objects.create(name="cat 2")
tag1 = Tag.objects.create(name="tag 1")
tag2 = Tag.objects.create(name="tag 2")
Tag.objects.create(name="tag 3")
post = Post()
post.title = "post 1"
post.body = "body 1"
post.category = cat
post.save()
post.tags.add(tag1)
post.tags.add(tag2)
post.save()
exit

サーバー起動
python manage.py runserver

これでPaizaCloudでは動いてます。
目次へ

動画Djangoチュートリアルを変えた部分

ググって試行錯誤した結果です。

やってないこと及び変更点(データベースの設定関係です。デプロイ先によりやり方が変わるので別途しらべてください。)
pip install dj-database-url
pip install python-dotenv
pip install psycopg2-binary → pip install psycopg2-binary==2.8.6
.envも作らず
環境設定ファイルを設置もやってない
DATABASE_URL=postgres://postgres:password@localhost/pj_dbやってない。
それ以外は下の「Herokuで動かす」→「Heroku用に編集」の項でかいていますが
Herokuはdjango-herokuというライブラリを使ってデータベースを設定してるみたいです。
settings.py変更

Herokuで動かす

Heroku のための Django アプリの設定を参考にしました。
settings.pyでHeroku用に書き換える部分はPaizaCloud上で変更すると
静的ファイルを集めるところでエラーになるので
GitHubで変更した。

ファイル追加

ディレクトリ構成
django-website-07ディレクトリ
  ├pj_blogディレクトリ
  │ ├settings.py
  │ └・・・
  ├blogディレクトリ
  ├requirements.txt
  ├Procfile

django-website-07を右クリックして新規ファイル作成で
2つファイル追加

requirements.txt
内容
django
gunicorn
whitenoise
psycopg2-binary==2.8.6はいらない。
PaizaCloud上で動かすときのみ使用するのと
PaizaCloudで動かすときはrequirements.txt自体使っていない。
ここでHeroku用に編集をやってもいい。
PaizaCloudで動かすときはsettings.pyのHeroku用設定をコメントアウトしてPaizaCloud用に戻す必要があります。

Procfile
(pj_blogはwsgi.pyのあるディレクトリ名)
内容
web: gunicorn pj_blog.wsgi

静的ファイル対応

django-website-07右クリックでstaticfilesフォルダを作る

ターミナルで
pip install whitenoise
settings.py変更
①MIDDLEWARE = [にwhitenoise追加
'whitenoise.middleware.WhiteNoiseMiddleware',

②1番下に2行追加
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

エラーになるので→
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
#STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
静的ファイルを一箇所に集める
ターミナルで
python manage.py collectstatic

目次へ

GitHubへプッシュ

GitHubでnewレポジトリ作成

PaizaCloudターミナルで
git config --global user.name "*****"
git config --global user.email "******@*******"
git init
git remote set-url origin https://ghp_*******@github.com/******/****.git
またはgit remote add origin https://ghp_*******@github.com/******/****.git

git status

modifide:赤字で出てるファイルを全部
git add .
で追加

git statusで全部緑になったか確認

git commit -m "コメント"

git push origin master
うまくいかない場合や****が分からない場合、以下参照

目次へ

Heroku用に編集

GitHubで鉛筆マークをクリックすると編集できます。
編集後はCommit changesにコメントを書きCommit changesを押せば更新されます。

requirements.txt
内容
django
gunicorn
whitenoise

django-heroku ←追加

whitenoise使っているのに、ここに記載しなくてもうまくいっていたが
立ち上がらないアプリがでた。logを見るとh10のエラー発生。whitenoise追加で直った。
settings.py変更
変更前
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'pj_db',
        'USER': 'postgres',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}
変更後
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.postgresql_psycopg2',
#         'NAME': 'pj_db',
#         'USER': 'postgres',
#         'PASSWORD': 'password',
#         'HOST': 'localhost',
#         'PORT': '',
#     }
# }
import django_heroku
django_heroku.settings(locals())

Herokuにデプロイ

2022/11/末Herokuの無料枠がなくなるのでRailwayに引っ越しました。

Herokuで
Create New Appでアプリの名前を付けたあと
settings→Config VarsのReveal Config Vars
DISABLE_COLLECTSTATICを1にしてaddします。

最初これをやらずにエラーになってエラーメッセージの中に
この設定をするように書いてあったのでやりました。
Heroku で自動的に collectstatic が実行されなくなります。
詳しくはcollectstatic の無効化

Herokuへデプロイします。やり方はこの記事を見てください。

2022/4/18現在というかこれから?HerokuでConect to GitHubの方法使えないようです。
herokuでgithubと接続すると「Item could not be retrieved: Internal Server Error」と出る

以下の方法でデプロイできました。
GitとHeroku CLIをパソコンにインストールして(2つで500Mぐらいの容量)
デプロイしたいGitHubのコードを自分のパソコンのGitにクローン
HerokuでCreate New Appします。
Deployment methodでHeroku Git Use Heroku CLIを選択、

ターミナルから(Anacondaが入ってる場合はAnacondaパワープロンプト)
cd クローンしたディレクトリ
heroku login
heroku git:remote -a アプリ名
git push heroku master

でデプロイできます。

簡単に書いておくと
Deployment methodをGitHub選択
search
GitHubのレポジトリが出てくるのでデプロイしたいものを選ぶ
Deploy Branchでデプロイできます。
デプロイが完了したらアプリを立ち上げる前に
データベースに項目を作って初期値を入れます。
右上のmore→run console
python manage.py migrate
以下コマンドでDjangoシェルを起動
python manage.py shell
from blog.models import *
cat = Category.objects.create(name="cat 1")
Category.objects.create(name="cat 2")
tag1 = Tag.objects.create(name="tag 1")
tag2 = Tag.objects.create(name="tag 2")
Tag.objects.create(name="tag 3")
post = Post()
post.title = "post 1"
post.body = "body 1"
post.category = cat
post.save()
post.tags.add(tag1)
post.tags.add(tag2)
post.save()
exit()

右上のOpen Appで起動できます。
完成品Railwayにデプロイ(毎月21日以降は停止してます)
完成品Renderにデプロイ(表示するまで数分かかることがあります)

セッションのほうが簡単

データを保存しておくのに上記のようにデータモデルを作って
データベースに保存するのは結構めんどうです。
一次的な保存になりますがセッションを使うと
かなり楽にデータベースにデータ保存ができます。
以下の記事を参考にしてください。
データを保持しておく方法

目次へ

MENTAやってます(ichige)

コメント

タイトルとURLをコピーしました