Djangoで作成したアプリケーションをサーバー(今回はheroku)にデプロイする際に発生するエラーの一つのOperationalErrorというものについて解決方法と解説をしていきたいと思います。(使用するPCはmac)
No such table: テーブル名
エラー文を読んでいくと、上記のように記述されているかと思います。恐らくDjangoで何かしらのアプリケーションを作った場合、最初にmodels.pyからDBを設計したかと思うのでテーブルは存在しているはずです。ではなぜデプロイ時にはmodels.pyのテーブルは反映されないのでしょうか?
sqliteは本番環境では使えない
models.pyはDBの管理システム(RDBMS)としてsqliteを使用しています。ローカル環境においてはsqliteで動くのですが、本番環境ではこの管理システムは利用できません。この理由としてはsqliteの特性の問題、gitignoreの問題の二つがあります。前者は詳しい説明をしている方が数名いましたので説明を省きます。
後者のgitignoreとは、特定のファイルをgitの管理外に置ける設定ができるファイルです。基本的にWebアプリケーションをサーバーにあげる際、まずgitにプッシュして、プッシュしたものをサーバーが読み取りブラウザ上に表示させます。その際コンフリクトを防ぐため開発メンバー固有のファイルは追跡対象から外し、プッシュします。この追跡対象外に特定ファイルを指定できるのがgitignoreです。
開発メンバー固有のファイルを具体的に述べると、今回の場合だと開発段階でDBで生成されたデータです。そのため、gitignoreのテンプレートにはsqliteが記載されています。
結果としてサーバー側はテーブルを認識できないのでOperationalErrorが出てしまいます。
解決方法、PostgreSQLを使う
そこで解決方法としてはPostgreSQLを今回は使うこととしました。herokuにおいてPostgreSQLを扱うにはまずローカル環境にインストールする必要がありますのでPostgreSQLをインストールしましょう。またコマンドライン上で操作するために以下のコマンドをターミナルに打ち込みます。
$ sudo mkdir -p /etc/paths.d && echo /Applications/Postgres.app/Contents/Versions/latest/bin | sudo tee /etc/paths.d/postgresapp
これでローカル環境においてPostgreSQLがインストールできました。この時点でherokuはデータベースを作ってくれているはずですが、万が一作成されていなかった場合は以下のコマンドで作って下さい。
$ heroku addons:create heroku-postgresql:hobby-dev
それではテーブルを作成していきます。ただその前にDjangoのアプリケーションがデータベースと連携できるようにdjango-herokuをインストールしていきます。
pip install django-heroku
このパッケージは自動的にデータベースのURLを設定、加えてstatic assetsをgunicornに繋げてくれます。(よく発生するエラーの対処法は以下に記載します)これを実際にDjangoのWebアプリケーションに繋げるにはsettings.pyに以下のように記載してください。
import django_heroku
django_heroku.settings(locals())
これで連携完了です!最後にコミットして、herokuにプッシュしましょう!
DBの問題はこれで解決します!
(*requirements.txtを最新のものにしてからコミット、プッシュをするのを忘れずに)
django-herokuをインストールした際にエラーが出た場合
よく発生するエラーとしてpsycopg2をインストールしようとsetup.pyを動かす時に出てくるものがあります。(かなりの長文で出てくるので一瞬パニックになります笑)解決方法は以下に記載します。
pip install psycopg2-binary
sudo xcode-select -switch /Library/Developer/CommandLineTools
これで恐らくdjango-herokuをインストールできます。
最後に
読んでくださった方はありがとうございます。
初めて書く記事ですので、もし誤り、ミスを発見した場合はコメントで連絡ください。